Java的快速查找

Java的快速查找,java,arrays,string,Java,Arrays,String,我目前有一个字符串数组,我需要多次搜索以获得精确匹配。最好使用什么样的数据结构 Example - String array with elements cat dog squirrel raccoon aardvark java代码接收字符串搜索并在数组上迭代: 查询“dogg”-不返回任何内容 查询“raccoon”-返回raccoon 我的当前代码执行以下操作: for (String element : myList) { if (element.equals(searc

我目前有一个字符串数组,我需要多次搜索以获得精确匹配。最好使用什么样的数据结构

Example - String array with elements

cat
dog
squirrel
raccoon
aardvark
java代码接收字符串搜索并在数组上迭代:

  • 查询“dogg”-不返回任何内容
  • 查询“raccoon”-返回raccoon
  • 我的当前代码执行以下操作:

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

    有没有更有效的方法进行此搜索?我考虑过使用地图,但我想不出一个好的值(关键是“狗”/“猫”等)。我应该为键和值使用相同的值吗?是否有更好的数据结构可供使用?

    您可以使用
    集合
    而不是
    映射
    (或者,如果是
    映射
    ,只需对键使用任何值):

    Example - String array with elements
    
    cat
    dog
    squirrel
    raccoon
    aardvark
    

    在此处使用
    哈希集
    ,以获得最佳查找性能。请注意,
    Set
    不允许任何重复项。使用
    映射
    在这里没有多大意义,因为您只对搜索键感兴趣,即您没有任何与之相关的内容

    示例代码:

    Set动物=新HashSet(
    asList(“猫”、“狗”、“松鼠”、“浣熊”);
    如果(动物包含(“狗”)){
    System.out.println(“是的,狗来了!”;//prints
    }
    如果(!animals.contains(“土豚”)){
    System.out.println(“啊,土豚失踪了!”;//prints
    }
    

    注意,
    列表
    也有一个
    包含()
    方法,但它会对其所有元素进行迭代,以检查是否存在与使用for循环时希望避免的性能差几乎相同的项。

    将它们放入
    HashSet
    中,因为它使用哈希,这是一种快速检索元素的技术,因为它使用hashcode存储它们

    Sub obj = new Sub();
    obj.items.add("one");
    obj.items.add("two");
    obj.items.add("three");
    
    System.out.println(obj.items.contains("one"));
    

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

    String result = myList.contains(searchTerm) ? result : "";
    
    你可以使用

    下面是中的一个实现。搜索的trie复杂性是
    O(L),其中L=stringToSearch.length()

    试试这个

        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");
    
    String[]arr=新字符串[]{“猫”、“狗”、“松鼠”、“浣熊”、“土豚”};
    List List=newarraylist(Arrays.asList(arr));
    System.out.println(list.contains(“dog”)?“found”:“notfound”);
    
    请注意,他要求的是最好的数据结构,而不是如何使他的代码更简洁。“有没有更有效的方法来进行此搜索?”是的,有一种方法:列表#容器这并不是更有效-它与OP的
    对于
    -内部循环的作用完全相同。您应该使用@nachokk Joda,是你吗?@nachokk虽然我同意你的回答,但有两点值得一提。1.
    HashSet
    实现在内部使用
    HashMap
    。2.您引用的实现本质上也在内部使用for循环。如您所见,它们在某种程度上与您的答案相矛盾。“您引用的实现本质上也在内部使用for循环。”呃,什么?你在说什么?@skuntsel 1。是的,这是正确的,但我认为这对OP没有帮助,因为他正在考虑直接使用
    Map
    。2.
    HashSet/Map
    的for循环实现与
    List
    的for循环实现完全不同(hash代码的使用提供了接近
    O(1)
    的查找性能),后者更类似于OP所做的:在元素上迭代的for循环。@RaviThapliyal我知道这一点。这就是为什么我说我同意你的答案,但发现解释有点模糊:)@nachokk抱歉,我无法回复你,因为老实说,我没有使用Trie的经验,所以我不知道哪种更好。但是,就冲突而言,您是正确的:哈希集的性能基本上取决于其元素的
    hashCode()
    实现的效率。但是,由于OP使用的是
    String
    ,所以我认为性能应该很好。您能否估计两者的平均搜索和插入复杂性,以证明trie比哈希集“性能更高”?
    String result = myList.contains(searchTerm) ? result : "";
    
        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");