2017-05-28 123 views
-1

數字組合我有一些大的字符串看起來像這樣的:提取字符串,並從一個較大的字符串

"text(24), text_2(5), text_4(822)..." 

我想檢查一個特定的文本存在,並且得到相應的價值。

有沒有快速的方法來做到這一點?

編輯:

我有一個包含所有可能的文本值的數組。目前我使用foreach來檢查文本值。 我有字符串text_2,我需要的是相應的5作爲整數。

+0

我認爲,正則表達式將完成這項工作https://www.javatpoint.com/java-regex – Rjiuk

+0

你是否試圖做一次或給定字符串的次數? –

+0

許多次 – Shaggy

回答

1

因爲您需要多次這樣做。我建議你分割字符串並從文本到它的值建立一個映射,這是O(n)。之後,如果使用HashMap,則查找只有O(1)。

String text = "text(24), text_2(5), text_4(822)"; 

Map<String, Integer> map = new HashMap<>(); 

String[] split = text.split(", "); 

for(String s:split){ 
    //search for the position of "(" and ")" 
    int start = 0; 
    int end = s.length()-1; 
    while(s.charAt(start) != '(') 
     start++; 
    while(s.charAt(end) != ')') 
     end--; 
    //put string and matching value in the map 
    map.put(s.substring(0, start), Integer.parseInt(s.substring(start+1, end))); 
} 

System.out.println(map); 

我還爲包含10000個條目的字符串運行了一些基準測試。這種方法比正則表達式快4倍。 (38毫秒vs 163毫秒)

+0

非常感謝你,這對我有效。 – Shaggy

+0

如果表現真的很重要。你可以在第一個分裂步驟中應用類似的搜索方法,但我不應該超過第2個因子 –

2

您可以使用regex從字符串提取所有text元素,並將它們存儲到一個map,e.g:

String s = "text(24), text_2(5), text_4(822)"; 
Pattern pattern = Pattern.compile("([a-zA-Z]*(_)?[0-9]*\\([0-9]+\\))"); 
Matcher matcher = pattern.matcher(s); 
Map<String, Integer> valuesMap = new HashMap<>(); 
while(matcher.find()){ 
    String[] tokens = matcher.group().split("(?=\\([0-9]+\\),?)"); 
    String key = tokens[0]; 
    Integer value = Integer.parseInt(tokens[1].substring(1, tokens[1].length() - 1)); 
    valuesMap.put(key, value); 
} 
System.out.println(valuesMap); 

一旦這樣做,你可以打電話valuesMap.get("test_2");得到相應的價值。這是上面的例子是如何工作的:

  • 它分裂成文本包含<text>(<Value)
  • 然後再次將每個令牌,令牌,textvalue並將它們放置到一個Map
+1

我認爲「text」和「text_2」就是例子。如果它適用於任何字符串,可能會更好。 –

+0

@ThijsSteel更新了答案。 –

+0

誰降低了這個?它適用於我 –