2014-10-29 240 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