我制作了一个小型Java程序,用于从用户选择的txt文件中加载单词列表,并将其逐字存储在TreeSet中。 现在我需要编写一个函数,每当用户在文本字段(keyPressed)中键入内容时,函数就会被调用,它会查找/返回此TreeSet中所有以用户输入的字母开头的单词。 我是使用Sets的新手,所以我的解决方案是从集合中的第一个元素迭代到最后一个元素并打印出符合条件的元素:
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个单词作为返回值,我的问题是:是否有更有效的解决方案来解决这个问题?
答案 0 :(得分:3)
最佳解决方案是使用trie,这是适合您的问题的数据结构。它用于在共享前缀的元素(通常是字符串)的工作时降低复杂性。
实际上有些工作我想你可以通过欺骗
来使用TreeSetpublic NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
这可以通过从fromElement传递当前键入的字符串和作为toElement的相同字符串来添加足够的'z'
个字符作为集合中最长的字符串(这个长度可以在填充{{{ 1}})。例如:
TreeSet