快速查找Java

时间:2013-07-05 13:53:39

标签: java arrays string

我目前有一个String数组,我需要多次搜索才能完全匹配。什么是最好的数据结构?

Example - String array with elements

cat
dog
squirrel
raccoon
aardvark

java代码接收字符串搜索并遍历数组:

  1. 查询'dogg' - 不返回任何内容
  2. 查询'raccoon' - 返回raccoon
  3. 我目前的代码执行以下操作:

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

    有更有效的方法来进行此搜索吗?我想过使用Map,但我想不出一个好的值(关键是'dog'/'cat'/ etc ....)。我应该为密钥和值使用相同的值吗?是否有更好的数据结构可供使用?

7 个答案:

答案 0 :(得分:10)

在此处使用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也有一个contains()方法,但它遍历其所有元素,以检查项目是否存在与使用for循环时要避免的相同的性能相同

答案 1 :(得分:4)

您可以使用Trie data structure

以下是guava trie中的实现。搜索的复杂性是O(L) where L = stringToSearch.length();

答案 2 :(得分:1)

您可以使用Set代替Map(或者,如果是Map,只需使用密钥的任何值):

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

答案 3 :(得分:1)

return myList.contains(searchTerm) ? searchTerm : null;

答案 4 :(得分:1)

试试这个

    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");

答案 5 :(得分: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"));

答案 6 :(得分:0)

如果您只想返回搜索字词,可以这样做

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