0

私はこの辞書を書き直そうとしています:アルファベット順ではなく長さでソートされた Dictionary.txt 。次のコードがあります(main(String[] args)内):

    BufferedReader read = new BufferedReader(new FileReader(new File(DIC_READ_PATH)));
    BufferedWriter write= new BufferedWriter(new FileWriter(DIC_WRITE_PATH),1);
    ArrayList<String> toWrite = new ArrayList<String>();
    for (int a = read.read(); a != -1; a = read.read()){
        char c = (char) a;
        toWrite.add("" + c + read.readLine());
    }
    read.close();
    Collections.sort(toWrite, new MyComparator());
    for (int a = 0; a <= 70000; a += 10000){
        write.write(toWrite.subList(a, a + 10000).toString().replaceAll("[\\[,\\]]", "").replaceAll(" ", "\n"));
        write.flush();
    }

    write.write(toWrite.subList(80000, toWrite.size()).toString().replaceAll("[\\[,\\]]", "").replaceAll(" ", "\n"));
    write.close();

マイコンパレータ:

public class MyComparator implements Comparator<String> {
@Override
    public int compare(String arg0, String arg1) {
    // TODO Auto-generated method stub
        if (arg0.length() == arg1.length()){
            return arg0.compareTo(arg1); 
        } 
        return arg0.length() < arg1.length() ? -1 : +1;
    }
}

Arraylist はうまくソートされますが、文字列を書き込むと、8 ワードは書き込まれません。BufferedWriter のバッファーを変更してみましたが、小さいバッファーが役立つことがわかったので、バッファーを 1 に設定しました。これを見つけました: Buffered Writer Java Limit / Issuesを書き、最後に閉じるたびにフラッシュを試みました (後でバッファーを変更しても) )。それでも 80368 ではなく 80360 語が表示されます。なぜ単語の完全なリストを書き込めないのですか? 別の BufferedWriter を使用する必要がありますか? もしそうなら、すでに書かれているものを上書きせずに使用するにはどうすればよいですか?

4

2 に答える 2

2

入力データのランダムな文字を消費しています:

for (int a = read.read(); a != -1; a = read.read()){

read()混ぜてreadLine()電話しないでください。readLine()nullを使用してテストするだけです。

また、結果を書き込むには、List.toString impl と厄介な正規表現の置換を使用しないでください。リストをループして、1 つの単語の後に改行を記述します。

于 2013-04-01T19:49:31.043 に答える
1

問題はここにあると思います:

 for (int a = 0; a <= 70000; a += 10000){
        write.write(toWrite.subList(a, a + 10000).toString().replaceAll("[\\[,\\]]", "").replaceAll(" ", "\n"));
        write.flush();
    }

.write("\n"); と書く必要があります。フラッシュ前。

于 2013-04-01T19:53:27.743 に答える