2014-02-12 95 views
0

我在這個格式的文件:跳過空白行,同時通過文件掃描

 
Gray M 0 0 869 0 0 0 0 0 0 0 0 0 0 0 

Mart M 722 957 0 0 0 0 0 0 0 0 0 0 0 0 

Adolfo M 0 995 0 859 0 646 742 739 708 731 671 649 546 0 

Livia F 0 0 0 0 0 0 0 0 0 0 0 0 0 826 

Mearl M 0 0 947 0 0 0 0 0 0 0 0 0 0 0 

Estel M 0 0 0 793 750 826 0 0 0 0 0 0 0 0 

Lee F 300 333 278 256 281 310 283 268 218 298 364 955 0 0 

Garnet F 0 704 663 464 421 665 721 0 0 0 0 0 0 0 

Stephan M 0 0 0 922 0 0 757 333 387 395 487 406 721 0 

(Last line in the file is a blank Line) 

我的方法接受一個字符串,如:「李F」,並把它比作一條線的前兩個令牌在文件中。如果它匹配行上的前兩個標記,則它返回兩個標記,如果它與文件中的任何內容不匹配,則告知用戶它沒有找到標記。我的程序運行良好,如果該名稱的文件,但如果名稱不是在文件中得到一個錯誤:

 
Exception in thread "main" 
java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at Names.findName(Names.java:36) 
    at Names.main(Names.java:9) 

這是發生,因爲我的if語句檢查一個空行似乎沒有不正在處理文件中最後一個空白行,我的代碼試圖從最後一行取兩個令牌....爲什麼它不跳過文件中最後一個空白行?

public static String findName(String nameGend) throws FileNotFoundException { 
     Scanner input = new Scanner(new File("names.txt")); 
     while (input.hasNextLine()) { 
      String line = input.nextLine(); 
      if (!(line.isEmpty())) { 
       String name= input.next(); 
       String gend= input.next(); 
       String nameGend2= name+ " " + gend; 
       if (nameGend.equalsIgnoreCase(nameGend2)) { 
        input.close(); 
        return nameGend2; 
       } 
      } 
     } 
     input.close(); 
     return "name/gender combination not found"; 
    } 
+1

你真的試過調試嗎? – Prince

回答

3
String name= input.next(); 
String gend= input.next(); 

這似乎是一個問題(特別是如果你在最後一行)。您已經閱讀完整行,爲什麼要從input進一步閱讀?如果沒有別的東西可讀?只是split()line上空間和提取的前兩個元素作爲namegend

String[] split = line.split("\\s+", 3); 

String name = split[0]; 
String gend = split[1]; 

注意的split()第二個參數表示該串只應被分成最多3個(這是最佳的,因爲我們只需要結果數組的前兩個元素)。

+0

不會改變分隔符效率更高嗎?您可以跳過空行或純空白行。 – Obicere

+0

@Obicere你也可以這樣做。您仍然需要從讀取的每一行中分割並提取數據。 – arshajii