Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查字符串是否存在的高效数据结构_Java_Algorithm_Data Structures_Arraylist_Hashmap - Fatal编程技术网

Java 检查字符串是否存在的高效数据结构

Java 检查字符串是否存在的高效数据结构,java,algorithm,data-structures,arraylist,hashmap,Java,Algorithm,Data Structures,Arraylist,Hashmap,我正在编写一个程序,它将向数据结构中添加越来越多或唯一的字符串。一旦这样做了,我以后需要不断检查其中是否存在字符串 如果我要使用ArrayList,我相信检查某个指定字符串的存在性将遍历所有项,直到找到匹配的字符串(或者到达末尾并返回false) 但是,使用HashMap,我知道在固定时间内,我可以简单地将键用作字符串并返回任何非null对象,从而加快此操作。但是,我不喜欢填充值完全任意的HashMap。是否有一个使用散列函数但不需要放置值的现成数据结构 如果我要使用ArrayList,我相信检

我正在编写一个程序,它将向数据结构中添加越来越多或唯一的字符串。一旦这样做了,我以后需要不断检查其中是否存在字符串

如果我要使用ArrayList,我相信检查某个指定字符串的存在性将遍历所有项,直到找到匹配的字符串(或者到达末尾并返回false)

但是,使用HashMap,我知道在固定时间内,我可以简单地将键用作字符串并返回任何非null对象,从而加快此操作。但是,我不喜欢填充值完全任意的HashMap。是否有一个使用散列函数但不需要放置值的现成数据结构

如果我要使用ArrayList,我相信检查某个指定字符串的存在性将遍历所有项,直到找到匹配的字符串

正确,检查列表中的项目在列表的条目数上是线性的

但是,我不喜欢填充值完全任意的HashMap

您不必这样做:Java提供了一个类,它非常类似于没有值部分的
HashMap

您可以将所有字符串放在那里,然后在固定时间内检查是否存在其他字符串

Set<String> knownStrings = new HashSet<String>();
... // Fill the set with strings

if (knownString.contains(myString)) {
    ...
}
Set knownStrings=new HashSet();
... // 用字符串填充集合
if(knownString.contains(myString)){
...
}

这取决于许多因素,包括必须输入到该数据结构中的字符串数量(您是否提前知道该数字,或有基本想法?),以及您预期的命中/未命中率

一个非常有效的数据结构是trie或基数树;它们基本上就是为此而设计的。有关它们如何工作的解释,请参阅(本页中有基数树定义的后续内容)。有一些Java实现(其中一个是;但是我有一组固定的字符串要注入,这就是我使用生成器的原因)

如果你的字符串数量非常庞大,你不会期望最小的误码率,那么你也可以考虑使用A;但问题是它是概率的;但是你可以很快得到“不在那里”的答案。这里还有Java实现(例如Guava有一个实现)


否则,
HashSet

HashSet可能是正确的答案,但如果您选择(例如,为了简单起见)搜索列表,则将单词连接成带有分隔符的字符串可能更有效:

String wordList = "$word1$word2$word3$word4$...";
String searchArg = "$" + searchWord + "$";
然后在分隔符之间使用您的单词创建搜索参数:

String wordList = "$word1$word2$word3$word4$...";
String searchArg = "$" + searchWord + "$";
然后搜索,例如,
包含

bool wordFound = wordList.contains(searchArg);

您可以通过使用StringBuilder构建searchArg来提高效率。

正如其他人提到的
HashSet
是一种方法。但是,如果大小很大,并且您可以接受误报(检查用户名是否存在),那么您也可以使用(概率数据结构)。

您的意思是,就像trie的
HashSet
?+1一样,这是此特定作业的规范数据结构