从较大的字符串中提取字符串和数字组合

时间:2017-05-28 13:11:41

标签: java

我有很多大字符串,如下所示:

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

我正在尝试检查特定文本是否存在并获得相应的值。

有快速的方法吗?

编辑:

我有一个包含所有可能文本值的数组。目前我使用foreach来检查文本值。 我有字符串text_2,我需要的是相应的5作为整数。

2 个答案:

答案 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)
  • 的标记
  • 然后再将每个令牌拆分为textvalue,并将其放入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毫秒)