2014-10-29 241 views
0

我设法让这段代码正常工作。它用大约10000个字读取test.txt(每个字在它自己的行中),并将它们按字母顺序排列,第二个按字节排列。然而,当我打开sort.txt之后,我首先得到了很多空行,然后这些单词格式正确。我的问题是如何删除thos空行,因为他们不能在那里。 .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

只是两个小点:在close()之前不需要调用flush()。您也不需要关闭fileWriter,因为在关闭printWriter时它将被关闭。 – 2014-10-29 10:01:41

+0

非常感谢编程仍然 – 2014-10-29 10:03:45

回答

1

只是不添加这些空行:

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

'字符串'也有'.isEmpty()' – fge 2014-10-29 10:00:07

+0

是的,你是对的^^ – 2014-10-29 10:01:11

0

所有你需要的是

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

不能使用.trim()依靠自己的力量解决问题,因为它只是黑客关闭在开头和结尾处有空格。它会保留一个空的String不变。我在这里用它来确保你也省略不为空,但确实有在短短的空白行。

+0

没有办法诀窍 – 2014-10-29 10:06:58

+0

@RokIvartnik你在两个地方输出,所以你需要它两次。但特里在输入时做同样的建议可能会更好。 – 2014-10-29 10:10:02

0

你可以处理它时,你实际上是添加字符串列表,这将是很好的方法类似

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

问题似乎在aplhabetical比较不长 – 2014-10-29 10:07:58

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'中的修剪,我相信你也处理前导/尾随空白。用下面的6行创建一个test.txt(点应该被空白替换)'.aa','.bbb','aaa','cc.','cc..','ddd'。 – SubOptimal 2014-10-29 12:05:49

+0

你好,我知道如果我从一个单词或一个单词后面留下空格,它不会使用它。对我来说真的很重要,因为我没有处理这个问题。但是,如果你知道如何解决这个问题,请回复,以便我可以学到更多。 – 2014-10-29 22:21:47

+0

如果行没有前导/尾随空白字符。那么你可以忽略这种长度。也许你最好编辑你的问题,提供一个你的输入的例子(可以是一个没有真实数据的genrice)和预期的输出。更好地理解你想要解决的问题。 – SubOptimal 2014-10-30 08:06:26