这是我的指示:
"构建一个程序,让用户从随机字母后果中创建不同的单词。 必须根据字典检查单词。"
这是到目前为止的代码:
import java.util.Arrays;
public class AngloTrainer {
// ...
public AngloTrainer(String dictionaryFile) throws IOException {
// load dictionary?
//what else?
}
private String sort(String s){
//Sort the letters in a string.
char[] tecken = s.toCharArray();
String sorted = Arrays.sort(tecken);
return sorted;
}
// use this to verify loadDictionary
private void dumpDict() {
// Print out the dictionary at the screen.
// ... define!
}
private void loadDictionary( String fileName ) {
// Read the dictionary into a suitable container.
// The file is a simple text file. One word per line.
FileReader flr = new Filereader(fileName);
BufferedReader bfr = new BufferedReader(flr);
String line;
//collection/treeset?? maybe other??
while((line = bfr.readLine()) !=null ){
//save to a collention, but which?
}
}
private String randomLetters( int length ) {
// this makes vovels a little more likely
String letters = "aabcdeefghiijklmnoopqrstuuvwxyyz";
StringBuffer buf = new StringBuffer(length);
for ( int i = 0; i < length; i++ )
buf.append( letters.charAt(randomGenerator.nextInt(letters.length())));
return buf.toString();
}
/* Def. includes
* Let #(x,s) = the number of occurrences of the charcter x in the string s.
* includes(a,b) holds iff for every character x in b, #(x,b) <= #(x,a)
*
* A neccessary precondition for includes is that both strings are sorted
* in ascending order.
*/
private boolean includes( String a, String b ) {
if ( b == null || b.length() == 0 )
return true;
else if ( a == null || a.length() == 0 )
return false;
//precondition: a.length() > 0 && b.length() > 0
int i = 0, j = 0;
while ( j < b.length() ) {
if (i >= a.length() || b.charAt(j) < a.charAt(i))
return false;
else if (b.charAt(j) == a.charAt(i)) {
i++; j++;
} else if (b.charAt(j) > a.charAt(i))
i++;
}
//postcondition: j == b.length()
return true;
}
public static void main(String[] args) {
// ... define!
}
}
我应该将哪个集合用于loadDictionary方法? 正如作业所说,我需要检查我对词典集合输入的单词。
答案 0 :(得分:0)
HashSet
提供更好的平均案例理论复杂度 - 但请注意,HashSet
按定义是无序的。这意味着“相关的”单词之间没有相关性(例如,cat
和catfish
可能彼此相距很远。
Hashset
提供O(1)
(或O(|S|)
确切,因为您需要阅读字符串)查找和插入。
TreeSet
理论上比HashSet
慢,并且O(logN)
(或者O(|S|logn)
,因为仍然需要读取字符串)。
但是,TreeSet
是SortedSet
的一个实例。这意味着根据比较器使用的“彼此靠近”的单词也将在其中彼此靠近。在String.compareTo()
的默认实现中 - 使用的排序为lexicographic order。这意味着共享相同前缀的单词将彼此“接近”。因此,如果您稍后打算将实现扩展到允许单词完成,例如 - TreeSet
是更好的选择,因为您可以使用tailSet()
方法。
TreeSet也不会遇到O(n)
的最坏情况复杂性,因此如果latency是您系统中的一个问题 - 它们应该优先于需要HashSet
的{{1}}偶尔维护数据结构的操作。
此外,您可以使用ArrayList
- 并确保使用Collections.sort()
对其进行排序。它应该成功,因为你的字典是静态的,而O(n)
更侧重于动态(不断变化的字典)。您稍后可以使用Collections.binarySearch()
针对字符串优化的其他数据结构是Trie,Radix tree(trie的更节省空间的变体)。但是 - 这些并没有在内置的Java Collections库中实现。如果您以后发现性能问题,并且需要加速代码的这一特定部分 - 您应该考虑切换到非内置数据结构,但作为启动器 - 让事情有效,不要过早地优化它