2013-04-01 2 views
-1

Я пытаюсь переписать этот словарь: dictionary.txt отсортировано по длине вместо этого в алфавитном порядке. У меня есть следующий код (внутри основного (String [] арг)):BufferedWriter Stops Writing

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(); 

MyComparator:

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; 
    } 
} 

Он сортирует Список_массивы штрафа, но когда я пишу строки, он не пишет 8 слов. Я попытался изменить буфер на BufferedWriter и обнаружил, что помощь поменьше буферов, поэтому я помещаю буфер 1. Я нашел это: Buffered Writer Java Limit/Issues и пытался промывать каждый раз, когда я пишу и закрываю в конце (даже после этого менялся Buffer). Я по-прежнему получаю 80360 слов вместо 80368. Почему он не будет писать полный список слов? Должен ли я использовать другой BufferedWriter? Если да, то как я могу использовать его без перезаписывания того, что уже написано?

ответ

2

вы потребляете случайные символы входных данных:

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

не смешивается read() и readLine() звонков. просто используйте readLine() и проверьте значение null.

также, чтобы написать свои результаты, не используйте функции List.toString impl и nasty regex, просто перетащите список и напишите одно слово, за которым следует новая строка.

+0

Никаких символов не потребляемых (a отбрасывается на char), но это может быть хорошей идеей. – Justin

+0

Интересно, почему я не думал о том, чтобы перебирать список? – Justin

+0

Я согласен, что это плохая практика, но imho это еще одна проблема. Реальная проблема «отсутствует 8» - это отсутствие новых строк. –

1

Я думаю, что проблема здесь:

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

Вы должны write.write ("\ п"); перед флешем.

+0

Если вы посмотрите на конец, каждый '' заменяется на '\ n', поэтому write.write ("\ n") не требуется – Justin

+0

Но в конце не будет места. ;) Интересно ли, что ровно 8 итераций? –

+0

Хорошая точка. Вероятно, это проблема. – Justin

 Смежные вопросы

  • Нет связанных вопросов^_^