如何创建随机字母的单词?

时间:2014-03-20 13:16:16

标签: java algorithm sorting hashset treeset

这是我的指示:

"构建一个程序,让用户从随机字母后果中创建不同的单词。 必须根据字典检查单词。"

这是到目前为止的代码:

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方法? 正如作业所说,我需要检查我对词典集合输入的单词。

1 个答案:

答案 0 :(得分:0)

HashSet提供更好的平均案例理论复杂度 - 但请注意,HashSet按定义是无序的。这意味着“相关的”单词之间没有相关性(例如,catcatfish可能彼此相距很远。
Hashset提供O(1)(或O(|S|)确切,因为您需要阅读字符串)查找和插入。

TreeSet理论上比HashSet慢,并且O(logN)(或者O(|S|logn),因为仍然需要读取字符串)。
但是,TreeSetSortedSet的一个实例。这意味着根据比较器使用的“彼此靠近”的单词也将在其中彼此靠近。在String.compareTo()的默认实现中 - 使用的排序为lexicographic order。这意味着共享相同前缀的单词将彼此“接近”。因此,如果您稍后打算将实现扩展到允许单词完成,例如 - TreeSet是更好的选择,因为您可以使用tailSet()方法。
TreeSet也不会遇到O(n)的最坏情况复杂性,因此如果latency是您系统中的一个问题 - 它们应该优先于需要HashSet的{​​{1}}偶尔维护数据结构的操作。

此外,您可以使用ArrayList - 并确保使用Collections.sort()对其进行排序。它应该成功,因为你的字典是静态的,而O(n)更侧重于动态(不断变化的字典)。您稍后可以使用Collections.binarySearch()

查找列表中是否有单词

针对字符串优化的其他数据结构是TrieRadix tree(trie的更节省空间的变体)。但是 - 这些并没有在内置的Java Collections库中实现。如果您以后发现性能问题,并且需要加速代码的这一特定部分 - 您应该考虑切换到非内置数据结构,但作为启动器 - 让事情有效,不要过早地优化它