我有很多大字符串,如下所示:
"text(24), text_2(5), text_4(822)..."
我正在尝试检查特定文本是否存在并获得相应的值。
有快速的方法吗?
编辑:
我有一个包含所有可能文本值的数组。目前我使用foreach来检查文本值。 我有字符串text_2,我需要的是相应的5作为整数。
答案 0 :(得分:2)
您可以使用regex
从字符串中提取所有text
元素并将其存储到map
中,例如:
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
。答案 1 :(得分: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毫秒)