У меня есть несколько больших строк, которые выглядят так:

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

Я пытаюсь проверить, существует ли определенный текст и получить соответствующее значение.

Есть ли быстрый способ сделать это?

Редактировать:

У меня есть массив со всеми возможными значениями текста. В данный момент я использую foreach для проверки текстовых значений. У меня есть строка text_2, и мне нужно соответствующее 5 в виде целого числа.

-1
Shaggy 28 Май 2017 в 16:11

2 ответа

Лучший ответ

Так как вам нужно сделать это несколько раз. Я предлагаю вам разбить строку и построить карту из текста до ее значения, это O (n). После этого ваши поиски только O (1), если вы используете HashMap.

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 мс против 163 мс)

1
Thijs Steel 28 Май 2017 в 14:19

Вы можете использовать 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.
2
Darshan Mehta 28 Май 2017 в 14:07