2014-10-29 5 views
0

Мне удалось получить этот код. Он читает test.txt с примерно 10000 словами (каждое слово в своей строке) и форматирует их сначала по алфавиту и второй длине BY. Однако, когда я открываю sort.txt, я получаю сначала, как много пустых строк, после чего слова правильно формируются. Мой вопрос заключается в том, как удалить пустые строки, поскольку они не могут быть там. Будет ли работать .trim?удаление пустых строк из txt-файла

package test; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.PrintWriter; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

public class sort { 
public static class MyComparator implements Comparator<String>{ 
    @Override 
    public int compare(String o1, String o2) { 
     if (o1.length() > o2.length()) { 
     return 1; 
     } else if (o1.length() < o2.length()) { 
     return -1; 
     } 
     return o1.compareTo(o2); 
    } 
} 
public static void main(String[] args) throws Exception { 

    String inputFile = "test.txt"; 
    String outputFile = "sort.txt"; 

    FileReader fileReader = new FileReader(inputFile); 
    BufferedReader bufferedReader = new BufferedReader(fileReader); 
    String inputLine; 
    List<String> lineList = new ArrayList<String>(); 
    while ((inputLine = bufferedReader.readLine()) != null) { 
     lineList.add(inputLine); 
    } 
    fileReader.close(); 

    Collections.sort(lineList,String.CASE_INSENSITIVE_ORDER); 

    FileWriter fileWriter = new FileWriter(outputFile); 
    PrintWriter out = new PrintWriter(fileWriter); 
    for (String outputLine : lineList) { 
     out.println(outputLine); 
    } 

    Collections.sort(lineList, new MyComparator()); 

    FileWriter Fw = new FileWriter(outputFile); 
    PrintWriter pw = new PrintWriter(fileWriter); 
    for (String outputLine : lineList) { 
     out.println(outputLine); 
    }  
    out.flush(); 
    out.close(); 
    fileWriter.close(); 

} 
} 
+0

только два младших пункта: нет необходимости называть flush() перед закрытием(). Вам также не нужно закрывать fileWriter, так как он будет закрыт при закрытии printWriter. –

+0

спасибо, действительно, для программирования еще –

ответ

1

просто не добавить эти пустые строки:

while ((inputLine = bufferedReader.readLine()) != null) { 
    if (!inputLine.isEmpty()) { 
     lineList.add(inputLine); 
    } 
} 
+0

'String' также имеет' .isEmpty() ' – fge

+0

да, вы правы ^^ –

0

Все, что вам нужно, это

for (String outputLine : lineList) { 
    if (!"".equals(outputLine.trim())) 
     out.println(outputLine); 
    //... 

Вы не можете использовать .trim() на своих собственных, чтобы решить эту проблему, потому что он просто рубит от пробелы в начале и в конце. Он оставит пустой String без изменений. Я использовал его здесь, чтобы убедиться, что вы также опускаете строки, которые не являются пустыми, но имеют только пробелы.

+0

не делает трюк –

+0

@RokIvartnik Вы выводите в двух местах, так что вам понадобится дважды , Но предложение Терри делать то же самое во время ввода, вероятно, все равно лучше. –

0

вы можете обработать его, когда вы фактически добавляете строку в список, который был бы хорошим подходом, например

while (!StringUtils.isEmpty(inputLine = bufferedReader.readLine())) { 
+0

Проблема, кажется, в аплавитском сравнении не длина –

0

Управление, чтобы заставить его работать. Вот решение. Спасибо за все ваши ответы.

package test; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.PrintWriter; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

public class sort { 
public static class MyComparator implements Comparator<String>{ 
    @Override 
    public int compare(String o1, String o2) { 
     if (o1.trim().length() > o2.trim().length()) { 
     return 1; 
     } else if (o1.trim().length() < o2.trim().length()) { 
     return -1; 
     } 
     return o1.compareTo(o2); 
    } 
} 
public static void main(String[] args) throws Exception { 

    String inputFile = "test.txt"; 
    String outputFile = "sort.txt"; 

    FileReader fileReader = new FileReader(inputFile); 
    BufferedReader bufferedReader = new BufferedReader(fileReader); 
    String inputLine; 
    List<String> lineList = new ArrayList<String>(); 
    while ((inputLine = bufferedReader.readLine()) != null) { 
     lineList.add(inputLine); 
    } 

    Collections.sort(lineList,String.CASE_INSENSITIVE_ORDER); 
    Collections.sort(lineList, new MyComparator()); 

    FileWriter fileWriter = new FileWriter(outputFile); 
    PrintWriter out = new PrintWriter(fileWriter); 
    FileWriter Fw = new FileWriter(outputFile); 
    PrintWriter pw = new PrintWriter(Fw); 
    for (String outputLine : lineList) { 
     if (!"".equals(outputLine.trim())) 
      out.println(outputLine);  }  
    out.flush(); 
    out.close(); 
    fileWriter.close(); 

} 
} 
+0

Вы уверены, что ваш код работает так, как ожидается? Основываясь на обрезке в вашем «MyComparator», я считаю, что вы имеете дело с ведущими/завершающими пробелами. Создайте test.txt со следующими 6 строками (точка должна быть заменена пустым) '.aa',' .bbb', 'aaa',' cc.', 'cc..',' ddd'. – SubOptimal

+0

Здравствуйте, я знаю, если я оставлю место из или за словом, он не использует его. Для меня это не очень важно, так как я не занимаюсь этим. Однако, если вы знаете, как это решить, ответьте, чтобы я мог узнать еще больше. –

+0

Если строки не имеют ведущих/завершающих пробелов. Затем вы можете опустить сортировку для длины. Возможно, вам лучше отредактировать свой вопрос, представив пример вашего ввода (может быть жанровым, без ваших реальных данных) и ожидаемым выходом. Чтобы лучше понять, что вы хотите решить. – SubOptimal

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