2013-07-05 4 views
2

В настоящее время у меня есть массив строк, который мне нужно найти много раз для точного соответствия. Какая будет лучшая структура данных?Быстрый поиск Java

Example - String array with elements 

cat 
dog 
squirrel 
raccoon 
aardvark 

код Java получает поиск строк и перебирает массив:

  1. запрос для 'Dogg' - ничего не возвращает
  2. запроса для 'енота' - возвращает енот

Мой текущий код делает следующее:

for (String element : myList) { 
     if (element.equals(searchTerm)) { 
      return searchTerm; 
     } 
} 

Есть ли более эффективный способ для этого поиска? Я думал об использовании Карты, но я не мог придумать хорошую ценность (ключ был бы «собака»/«кошка»/etc ....). Должен ли я использовать одно и то же значение для ключа и значения? Есть ли лучшая структура данных для использования?

+5

с синтаксического дерева, вы должны использовать http://en.wikipedia.org/wiki/Trie – nachokk

+9

@nachokk Joda, это ты? –

+0

@nachokk http://en.wikipedia.org/wiki/Yoda – GriffeyDog

ответ

8

Используйте HashSet здесь для лучшей производительности поиска. Пожалуйста, обратите внимание, что Set не позволит использовать какие-либо дубликаты. Использование Map здесь не имеет особого смысла, поскольку вас интересует поиск ключей, т. Е. У вас нет ничего связанного с ним.

Пример кода:

Set<String> animals = new HashSet<String>(
          Arrays.asList("cat", "dog", "squirrel", "raccoon")); 
if (animals.contains("dog")) { 
    System.out.println("Yep, dog's here!"); // prints 
} 
if (!animals.contains("aardvark")) { 
    System.out.println("Ah, aardvark's missing!"); // prints 
} 

Обратите внимание, что List также имеет метод но перебирает все ее элементы, чтобы проверить, если элемент существует довольно много с той же низкой производительности вы хотите, чтобы избежать при использовании цикла for.

+0

это более результативный, чем trie? – nachokk

+1

Хотя я согласен с вашим ответом, стоит упомянуть два момента. 1. Реализация «HashSet» использует «HashMap» внутренне. 2.Ваша ссылочная реализация по существу также использует внутренний цикл for-loop. Как вы видите, они в какой-то мере противоречат вашему ответу. – skuntsel

+0

«Ваша ссылочная реализация по существу также использует внутренний цикл». Что, что? О чем ты говоришь? –

1

Вы можете использовать Set вместо Map (или, в случае Map, просто использовать любое значение ключа):

if (mySet.contains(element)) { 
    return element; 
} else { 
    return null; 
} 
0

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

Sub obj = new Sub(); 
obj.items.add("one"); 
obj.items.add("two"); 
obj.items.add("three"); 

System.out.println(obj.items.contains("one")); 
1
return myList.contains(searchTerm) ? searchTerm : null; 
+0

Обратите внимание, что он просит лучшую структуру данных, а не как сделать код более кратким. – arshajii

+0

«Есть ли более эффективный способ для этого поиска?» да есть один: Список № содержит –

+2

Это не более эффективно - он делает то же самое, что и внутренний цикл OP для 'for'-loop. – arshajii

0

Если вы хотите только вернуть вам поиск по ключевому слову, вы можете сделать это, как этот

String result = myList.contains(searchTerm) ? result : ""; 
3

Вы можете использовать Trie data structure

Вот реализация в guava trie. И Trie сложность для поиска является O(L) where L = stringToSearch.length();

+0

Не могли бы вы оценить средний поиск и вставить сложность обоих, чтобы оправдать, что trie «намного более результативен», чем хэш-набор? –

+0

@Grzegorz извините за последнее время, я редактировал: D – nachokk

0

Попробуйте

String[] arr = new String[]{"cat", "dog", "squirrel", "raccoon", "aardvark"}; 
    List<String> list=new ArrayList<String>(Arrays.asList(arr)); 
    System.out.println(list.contains("dog") ? "found" : "not found"); 
+0

«любил» собак? :) –

+0

Извините, набрав ошибку, спасибо, что указал мне –

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