Java - 如何在键入时有效地显示单词列表中的单词

标签 java iterator treeset startswith

我制作了一个小型 Java 程序,它从用户选择的 txt 文件中加载单词列表,并将其逐字存储在 TreeSet 中。 现在我需要编写一个函数,每当用户在文本字段(keyPressed)中输入内容时,就会调用一个函数,并查找/返回此 TreeSet 中以用户输入的字母开头的所有单词。 我是使用集合的新手,所以我的解决方案是从集合中的第一个元素迭代到最后一个元素,并打印出满足条件的元素:

Iterator <String>itr = dictionary.iterator();
String currentWord;
String tempUserInput = "av"; // Temporary, to simulate user input
while(itr.hasNext()){
   currentWord = itr.next();
   if (currentWord.startsWith(tempUserInput)) {
      System.out.println(currentWord); // Temporary, to simulate output
   }
}

这工作正常,但是,由于它需要传递超过 300000 个单词作为返回值,我的问题是:是否有更有效的解决方案来解决这个问题?

最佳答案

最好的解决方案是使用 trie这是适合您的问题的数据结构。它旨在用于降低共享前缀的元素(通常是字符串)工作时的复杂性。

实际上,通过一些工作,我猜你可以通过欺骗来使用 TreeSet

public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)

这可以通过将当前输入的字符串作为 fromElement 传递,并将添加了足够的 'z' 字符作为集合中最长字符串的同一字符串作为 toElement 传递(可以计算该长度)填充 TreeSet 时)。例如:

subSet("foo", true, "foozzzzzzzz", true);

关于Java - 如何在键入时有效地显示单词列表中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13335125/

相关文章:

java - Crawler4j 身份验证不起作用

java - 国际象棋棋盘的 ASCII 表示

java - 具有相同删除的两种方法不一定是等效的(或者它们之间的签名不是子签名)?

c++ - 通过迭代器使用连接、信号和槽

c++ - 调用模板函数问题 "No matching function for call"arguments : iterators, object function

java - 在 TreeSet 中交换键?

java - 如何通过用户输入更改绘制对象的位置

c++ - 插入函数中的迭代器集

java - 如何检查一组矩形的孔洞和相互作用?

java - 如何根据这些条件对对象的 HashSet 进行排序?