2012-03-12 4 views
-2

Кто-нибудь знает самый быстрый способ сравнения одной строки с n количеством строк для совпадения?Сравнение n строк в java

Например: слово «пример» необходимо сравнить со списком, содержащим n количество слов, для соответствия. Список может содержать любое количество слов любой длины.

Есть ли конкретный алгоритм, который я могу использовать для этого? Я знаю алгоритмы соответствия строк, которые находят подстроку внутри строки, такую ​​как алгоритм Boyer-Moore. Но не для этого. Пожалуйста, помогите мне здесь. Обратите внимание, что я буду реализовывать это на Java.

+0

Является ли список слов отсортированным или индексированным каким-либо образом? В противном случае вам просто нужно сделать вас Boyer-Moore для каждого из них в цикле. – Thilo

+1

Какой матч? Ответы предполагают, что под «совпадением» вы подразумеваете «найти точно такую ​​же строку», а не подстроку, например. – Thilo

+0

строки не отсортированы в любом случае, и да, я пытаюсь получить точное соответствие (нечувствительное к регистру) –

ответ

0

Вы можете подготовить Map<Int,List<String>> для вашего списка, где ключевым является .hashcode() для строки и списка содержит все строки с тем же хэш-кодом.

Затем вы просто просматриваете hashcode для своей новой строки и запускаете equals() для каждой строки в возвращаемом списке.

Должно быть намного быстрее, так как для сравнения имеется намного меньше записей. Обратите внимание, что подготовка требует некоторого времени, поэтому делайте это только в том случае, если вам нужно сделать это несколько раз.

+0

, пожалуйста, объясните, как сделать эту работу для нечувствительного к регистру соответствия (см. Комментарии к вопросу). – Thilo

+0

Если строки могут быть уменьшены и все еще имеют смысл, то строчные буквы перед обработкой. –

3

Вы можете использовать метод contains.

List<String> lstr = Arrays.asList(new String[]{"a", "b", "c", "d", "e"}); 
Collections.sort(lstr); 

lstr.contains("c"); // true 
lstr.contains("f"); // false 
+0

Не работает с нечувствительным к регистру совпадением (см. Комментарии к вопрос). – Thilo

2

Выполнить цикл до конца списка и сравнить каждый элемент, используя Equals() метода

+1

+1 или equalsIgnoreCase в этом случае. Также, возможно, выйдут на первый матч. – Thilo

0

Предполагая, что вы просто хотите проверить точное соответствие, вы можете либо сохранить хеш-карту своего словаря, либо просмотреть хеш слова, либо использовать дерево типа http://en.wikipedia.org/wiki/Trie, где каждый узел является буквой.

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

+0

Предполагается, что вам нужно сделать это несколько раз для того же списка. – Thilo

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