2013-09-27 5 views
1

Что я хотел бы сделать, это проверить, содержит ли строка элемент из массива String. Я думаю, что итерация всех элементов массива и просмотр, если String.contains (элемент) не кажется эффективным. Поэтому я задаюсь вопросом, есть ли более эффективный способ быстро сделать этот поиск.Java - как проверить, содержит ли строка элемент массива строк?

Например, я хочу получить название страны из адресной строки. Пользователи могут писать свой адрес без каких-либо ограничений. Строка адреса может содержать название страны или название города. Поэтому я хочу посмотреть, есть ли в адресной строке элемент из массива, который я создам, с несколькими именами стран и названиями городов.

Мой текущий решение:

ArrayList<String> list; 
String address; 
      ... 
    for (String s : list) { 
     if (address.contains(s)) 
      return s; 
    } 

Это О (п). Интересно, есть ли более быстрое решение.

спасибо.

+1

У вас есть пример кода? –

+0

Если массив элементов не был слишком длинным, я бы просто повторил. Вы можете альтернативно построить «динамическое» регулярное выражение 'Pattern', но это похоже на большую работу, чем это было бы полезно. – jedwards

+0

Если он может сохранить шаблон, использовать его было бы лучше. –

ответ

0

Вы можете использовать цикл for для итерации по массиву и проверить, находятся ли элементы в String.

Лучший способ проверить, содержит ли строка строку с определенной строкой, использовать методы в классе String, такие как String.contains (char). Вы должны сделать еще несколько экспериментов, прежде чем задавать тривиальный вопрос или, по крайней мере, дать нам несколько примеров, которые могут быть решены напрямую.

+0

Он ищет что-то эффективное, чем это @Hatori проверяет его сообщение – Prateek

+0

И главное - упорядочить свой код, чтобы вы могли как можно скорее сломаться после поиска необходимой информации. –

+1

@Prateek Я считаю, что вы не должны пытаться оптимизировать код, который не нуждается в оптимизации. –

0

Я предполагаю, что вы не используете Guava или другую библиотеку со способом объединения. В этом случае вы можете создать регулярное выражение вручную.

private String regex(String[] names) { 
    final StringBuilder b = new StringBuilder(); 
    String separator = ""; 
    for (final String name: names) { 
     b.append(separator); 
     b.append(Pattern.quote(name)); 
     separator = "|"; 
    } 
    return b.toString(); 
} 

Петля и переменная separator не является «не-если» способ объединения имен. Вызов quote гарантирует, что символы, подобные $, [, или ., не испортят вещи. Что, если одна из твоих строк была «Сент-Луис»?

Затем вы используете Matcher.find для проверки.

public boolean contains(String target, String[] names) { 
    String regex = regex(names); 
    Pattern pattern = Pattern.compile(regex); // Fixed, as per @Java Devil's comment. 
    Matcher m = pattern.match(target); 
    return m.find(); 
} 

Если вы хотите, чтобы захватить найденную строку, заключите регулярное выражение в скобках, и вернуться m.group(1) вместо этого.

+1

Мне было бы интересно узнать, как это сравнивается с циклом массива и использованием 'contains' ... – MadProgrammer

+0

Также интересно, я думаю, было бы хуже, учитывая, что это все равно петли массива, но добавляет накладные расходы на' StringBuilder'. Также я не знал, что 'Pattern.compile();' принят 'String []' –

+0

Извините, этого нет. Я буду редактировать, чтобы использовать 'regex' в шаблоне. –

Смежные вопросы