2013-07-05 122 views
2

我目前有一个字符串数组,我需要多次搜索才能完全匹配。什么是最好的数据结构使用?快速查找Java

Example - String array with elements 

cat 
dog 
squirrel 
raccoon 
aardvark 

Java代码接收搜索阵列之上串和迭代:

  1. 关于 '狗狗' 查询 - 返回任何
  2. 查询关于 '浣熊' - 返回浣熊

我目前的代码执行以下操作:

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

是否有更高效的方法来执行此搜索?我想过使用Map,但我想不出一个好的价值(关键是'狗'/'猫'/等等......)。我应该使用相同的键值和值吗?有更好的数据结构可供使用吗?

+5

你应该使用http://en.wikipedia.org/wiki/Trie – nachokk

+9

@nachokk乔达一个线索,是你吗? – 2013-07-05 14:01:33

+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循环。如你所见,它们在某种程度上与你的答案相矛盾。 – skuntsel

+0

“您引用的实现本质上也在内部使用for循环。”呃,什么?你在说什么? –

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'循环完全相同的功能。 – arshajii

0

如果你只想要回你搜索词,你可以做这样的

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

您可以使用Trie data structure

这里是guava trie的实现。和特里结构复杂搜索O(L) where L = stringToSearch.length();

+0

您能否估计平均搜索和插入复杂性,以证明该特性比哈希集合'性能高得多'? –

+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

对不起,输入错误,谢谢指出我 –