希望這不會讓你掃興或東西,但如果我是你,我會採取這種做法..
僞的java:
abstract class Word {
String word;
char last();
char first();
}
abstract class DynamicDictionary {
Map<Character,Set<Word>> first_indexed;
Word removeNext(Word word){
Set<Word> candidates = first_indexed.get(word.last());
return removeRandom(candidates);
}
/**
* Remove a random word out from the entire dic.
*/
Word removeRandom();
/**
* Remove and return a random word out from the set provided.
*/
Word removeRandom(Set<Word> wordset);
}
然後
Word primer = dynamicDictionary.removeRandom();
List<Word> list = new ArrayList<Word>(500);
list.add(primer);
for(int i=0, Word cur = primer;i<499;i++){
cur = dynamicDictionary.removeNext(cur);
list.add(cur);
}
注意:不打算被視爲真正的java代碼,只是粗略地解釋方法的一種方式(沒有錯誤處理,如果真的被使用,沒有良好的類結構等等)。
我應該遇到內存問題,也許我會做到這一點:
abstract class Word {
int lineNumber;
char last();
char first();
}
如果這還不夠,想我會使用該文件的二進制搜索或把它放在一個DB等。
僅供參考:1十萬= 100000 – miku 2010-08-01 08:28:36
非常瞭解它。文本文件是4MB! – 2010-08-01 08:38:52
4MB很小,不是嗎? – miku 2010-08-01 08:50:43