Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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_Dictionary_Arraylist_Data Structures - Fatal编程技术网

Java 我的字典应该使用什么数据结构?

Java 我的字典应该使用什么数据结构?,java,dictionary,arraylist,data-structures,Java,Dictionary,Arraylist,Data Structures,我想用Java创建一个包含大约10000个单词对的字典,但我不知道应该使用什么样的数据结构。如果我的字典中有一个单词,例如,因为,如果我只搜索bec,我希望程序能找到它。如果我有一个短语,如结尾,我希望在搜索th或en时找到它 我尝试了ArrayList,但搜索速度相当慢。我不想使用实现Map接口的类,因为它们只能为一个键存储一个值,所以我不能像上面描述的那样进行搜索 这个答案列出了一些字典的数据结构,但我认为它们并不适合我:您可以使用NavigableSet,它允许您进行部分查找 Naviga

我想用Java创建一个包含大约10000个单词对的字典,但我不知道应该使用什么样的数据结构。如果我的字典中有一个单词,例如
,因为
,如果我只搜索
bec
,我希望程序能找到它。如果我有一个短语,如
结尾
,我希望在搜索
th
en
时找到它

我尝试了
ArrayList
,但搜索速度相当慢。我不想使用实现
Map
接口的类,因为它们只能为一个键存储一个值,所以我不能像上面描述的那样进行搜索


这个答案列出了一些字典的数据结构,但我认为它们并不适合我:

您可以使用NavigableSet,它允许您进行部分查找

NavigableSet<String> words = new TreeSet<>();
words.add("tee");
words.add("the");
words.add("there");
words.add("tidy");

String th = words.higher("th");
System.out.println("th ... "+th);
如果你想要多个单词,你可以这样做

NavigableSet<String> words = new TreeSet<>();
words.add("tee");
words.add("the");
words.add("their");
words.add("there");
words.add("tidy");

String start = "th";
for (String w : subSet(start, start + '\uffff')) {
    System.out.println(start + " ... " + w);
}
您可以使用单独的地图按单词查找短语


注意:这将比使用SQL数据库快1000倍到10000倍。

您要搜索的是一个数据库。 由于java框架似乎没有一个实现,请查看可能的库和解决方案:

  • 中的解释和基本java实现
  • 解释和基本java实现
  • 解释和基本java实现
  • GitHub上的java库
  • GitHub上的java库
  • 作者:俄勒冈州GitHub的Brianfromolegon

  • 使用简单数组
  • 对数组进行排序
  • 用二进制搜索
  • 如果只填写一次字典,然后只进行搜索,这是最快的解决方案

    以相同字母开头的单词将被堆叠在一起


    附加的树索引只有在数据足够大的情况下才有用。

    您可以在
    映射中为每个键存储一个值,但是没有什么可以阻止您将该值作为
    集或
    列表,甚至另一个
    映射
    …为什么不使用sql数据库呢?然后你可以用
    之类的操作符。我不太明白你说的话,你能解释得更详细一点吗?它只存储一个单词,而不是一个有其含义的单词。如果我键入“th”,我想列出所有以“th”开头的单词,因此不仅要列出“the”,还要列出“there”。@racz16我已更新了我的答案,以包括多个结果。你能为答案添加链接摘要吗?链接在一段时间后有消失的趋势。如果我只存储单词就好了。但是,如果我存储例如“theend”,那么如果我键入“t”、“th”或“the”,trie将只列出“theend”(及其含义)。但如果我键入“e”、“en”或“end”,我想列出它。因此,我想列出以我在搜索区域键入的字母开头的短语。@racz16我认为没有优化的
    String的结构包含
    检查,但根据短语长度,可以检查其子字符串,例如“the end”、“he end”、“e end”、“end”、“end”、“nd”、“d”。最后,我实现了一个trie,它工作得很好,速度很快。
    
    NavigableSet<String> words = new TreeSet<>();
    words.add("tee");
    words.add("the");
    words.add("their");
    words.add("there");
    words.add("tidy");
    
    String start = "th";
    for (String w : subSet(start, start + '\uffff')) {
        System.out.println(start + " ... " + w);
    }
    
    th ... the
    th ... their
    th ... there