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代码接收字符串搜索并在数组上迭代:
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");