數字組合我有一些大的字符串看起來像這樣的:提取字符串,並從一個較大的字符串
"text(24), text_2(5), text_4(822)..."
我想檢查一個特定的文本存在,並且得到相應的價值。
有沒有快速的方法來做到這一點?
編輯:
我有一個包含所有可能的文本值的數組。目前我使用foreach來檢查文本值。 我有字符串text_2,我需要的是相應的5作爲整數。
數字組合我有一些大的字符串看起來像這樣的:提取字符串,並從一個較大的字符串
"text(24), text_2(5), text_4(822)..."
我想檢查一個特定的文本存在,並且得到相應的價值。
有沒有快速的方法來做到這一點?
編輯:
我有一個包含所有可能的文本值的數組。目前我使用foreach來檢查文本值。 我有字符串text_2,我需要的是相應的5作爲整數。
因爲您需要多次這樣做。我建議你分割字符串並從文本到它的值建立一個映射,這是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毫秒)
非常感謝你,這對我有效。 – Shaggy
如果表現真的很重要。你可以在第一個分裂步驟中應用類似的搜索方法,但我不應該超過第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)
text
和value
並將它們放置到一個Map
。我認爲「text」和「text_2」就是例子。如果它適用於任何字符串,可能會更好。 –
@ThijsSteel更新了答案。 –
誰降低了這個?它適用於我 –
我認爲,正則表達式將完成這項工作https://www.javatpoint.com/java-regex – Rjiuk
你是否試圖做一次或給定字符串的次數? –
許多次 – Shaggy