Java:检查字符串是否在单词列表中的最有效方法

Java:检查字符串是否在单词列表中的最有效方法,java,string-comparison,Java,String Comparison,我有一个字符串数组String[]words和一个28000字的单词列表 我想检查字符串数组的任何成员是否在单词列表中(单词列表在文本文件WordList.txt中) 最有效的方法是什么?将字符串直接放在哈希集中,而不是数组中,然后在集合中使用来检查内容。你不会改进O(1)访问。如果存在任何重复项,这也将最大限度地减少用于存储字符串的内存。您可以使用哈希集或数组列表,其中包含方法。它将检查您的字符串是否已存储。 HashSet和ArrayList之间的区别在于,HashSet不允许重复值,并且它

我有一个字符串数组
String[]words
和一个28000字的单词列表

我想检查字符串数组的任何成员是否在单词列表中(单词列表在文本文件WordList.txt中)


最有效的方法是什么?

将字符串直接放在
哈希集中,而不是数组中,然后在集合中使用来检查内容。你不会改进O(1)访问。如果存在任何重复项,这也将最大限度地减少用于存储
字符串的内存。

您可以使用
哈希集
数组列表
,其中包含
方法。它将检查您的字符串是否已存储。
HashSet
ArrayList
之间的区别在于,HashSet不允许重复值,并且它不会维护顺序,而ArrayList允许复制,并且它是一个有序的集合。 但是HashSet比arraylist更能有效地执行搜索操作。

您可以尝试数组(树)后缀算法,但您需要实现,如下所示:


第1步:不要使用字符串数组。而不是使用HashSet

步骤2:将文件(即wordlist.txt)内容加载到另一个哈希集中

步骤3:

Set<String> set1 = new HashSet<String>(); //Load the string array into set
    Set<String> set2 = new HashSet<String>(); //load the file contents into set
    for (String str : set1) {
        for (String str2 : set2) {
            if (str.equalsIgnoreCase(str2)) {
                break;
            }
        }
    }
Set set1=new HashSet()//将字符串数组加载到集合中
Set set2=新的HashSet()//将文件内容加载到集合中
用于(字符串str:set1){
用于(字符串str2:set2){
if(str.equalsIgnoreCase(str2)){
打破
}
}
}

创建字符串的
哈希集
,如下所示

HashSet<String> wordSet = new HashSet<String>(Arrays.asList(words));
HashSet-wordSet=新的HashSet(Arrays.asList(words));

并使用方法检查
HashSet
中的
word
,其中
word
是要检查是否存在的单词。

存储序列化的HashSet,而不是原始words.txt。作为运行应用程序的一个单独步骤


然后,应用程序只需加载哈希集一次。

HashSet
add()

for (String str : words) {
  if (!wordSet.add(str)) {
    System.out.println("The word " + str + " is already contained.");
  }
}

这比
contains()

复杂一点,级别也不低。如果你的单词列表可以放在内存中,那么哈希集就足够了


如果内存大小是一个问题,请使用。虽然bloom filter可能给出错误的答案,但您可以调整其发生的概率。

听起来您使用了错误的数据结构。一个
HashSet
可以更好地匹配。这将需要大量的内存来形成kd树和单词列表,每个字母表都是一个维度。使用字符串[]单词并在树中查找最近的邻居。我不推荐arraylist,它必须检查所有项,而HashSet必须检查具有相同hashCode()的项的.equals()…对于大型列表,我不认为
ArrayList
search是高效的。我真的认为使用Java的内置数据类型进行这样的搜索效率非常低。@metsburg,那么您有更好的实现了吗?;-)谢谢你的评论。是的,HashSet比ArrayList更有效。我只是向他展示了两种方法及其不同之处,所以将整个单词列表读入哈希集中也不是一个好主意?不,你会想删除重复项以减少内存占用,所以直接使用哈希集是一种方法(另外,你不必重新填充哈希集,这在代码使用方面也是一个小小的胜利!)检查set2.contains(str)是否包含会更快。这是一个1阶运算,也是使用集合的主要好处之一。它把这个从O(n^2)变成O(n)