2016-11-23 99 views
-1

我試圖編寫一種方法來掃描文本文件,並將所有以#開頭的行添加到String稱爲元數據。之後,我想掃描接下來的三個整數,從第一行開始,不包含#。但是,不包含#的第一行會被跳過,因爲我已經使用scan.nextLine()來掃描它。如何掃描已掃描的行中的整數scan.nextLine()

File file = new File(filename); 
Scanner scan = new Scanner(file); 

String format = scan.nextLine(); 
String metadata = ""; 

//This loop adds all lines starting with # to metadata. 
outerloop: 
while(scan.hasNextLine()){ 
    String line = scan.nextLine(); 
    if(line.startsWith("#")){ 
     metadata = metadata+line; 
    } else { 
     break outerloop; 
    } 
} 

//Scans the next three integers and sets them equal to width, height, and maxRange. 
int width = scan.nextInt(); 
int height = scan.nextInt(); 
int maxRange = scan.nextInt(); 

我的輸入是一個文本文件。前六行顯示在此屏幕截圖中。

screenshot

只有一個以#開頭的行,但我的方法必須能夠處理與多條線路,從第一個文件。輸出應該

format = "P3" 
metadata = "# CREATOR: GIMP PNM Filter Version 1.1" 
width = 200 
height = 133 
maxRange = 255 

但是相反,我得到

format = "P3" 
metadata = "# CREATOR: GIMP PNM Filter Version 1.1" 
width = 255 
height = 183 
maxRange = 187 
+0

顯示我們作爲評論什麼是輸入和預期輸出請... –

+0

http ://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#Scanner-java.lang.String- –

+1

你可以使'新的掃描儀(行)' –

回答

1

你行是一個字符串。您可以搜索符合以下正則表達式的所有子:

[0-9]+ 

這可以通過以下方式進行:

List<String> matches = new ArrayList<>(); 
Matcher m = Pattern.compile("[0-9]+") 
        .matcher(readLineWhichIsString); 
while (m.find()) { 
    matches.add(m.group()); 
} 

int[] numbersInLine = new int[matches.size()]; 
for (int i = 0; i < matches.size(); i++) { 
    numbersInLine[i] = Integer.parseInt(matches.get(i)); 
} 

上述解決方案將12a匹配12。如果你不需要它,只需更改正則表達式。我會爲你做一些研究。

Matcher m = Pattern.compile("[0-9]+(?=\\s|$)") 

將只匹配那些String s表示是數字後跟一個空格或String端。

編輯:
下面的代碼將填補int[] valuesint參數。

String line; 
while(scan.hasNextLine()){ 
    line = scan.nextLine(); 
    if(line.startsWith("#")){ 
     metadata = metadata+line; 
    }else{ 
     break outerloop; 
    } 
} 

int[] values = new int[3]; 
List<String> matches = new ArrayList<>(); 
Matcher m = Pattern.compile("[0-9]+(?=\\s|$)") 
       .matcher(readLineWhichIsString); 
while (m.find()) { 
    matches.add(m.group()); 
} 

int i = 0; 
for (i = 0; i < Math.min(matches.size(), values.length); i++) { 
    numbersInLine[i] = Integer.parseInt(matches.get(i)); 
} 
while (i < 3) { 
    values[i] = scan.nextInt(); 
} 
+0

謝謝,結束了使用新的掃描儀(線),而不是因爲它更簡單。 –

+0

@MeghanWhite無論如何推薦您嘗試我的解決方案,因爲它有一天可能會有所幫助。 – xenteros

0

您的問題是在邏輯上,當你在排隊檢查#,這是不是你想讀該行再次

這裏提議的解決方案

//This loop adds all lines starting with # to metadata. 
    String line = null; 
    while(scanner.hasNextLine()){ 
    line = scanner.nextLine(); 
    if(line.startsWith("#")){ 
     metadata = metadata+line; 
    }else{ 
     break ; 
    } 
    } 

    //Scans the next three integers and sets them equal to width, height, and maxRange. 
    String ints[]=line.split(" "); 
    int width = Integer.parseInt(ints[0]); 
    int height = Integer.parseInt(ints[1]); 
    int maxRange = scanner.nextInt(); 

這工作,你獲得期望reuslt 以及爲什麼重新讀取文件,當你已經線