2016-11-15 68 views
1

我製作了一個掃描程序,它讀取一種假的語言,並返回一串數字來表示關鍵字,字母/字母以及數字,數字和符號由解析器讀取。在While循環中創建一個帶有字符的字符串Java

我遇到的問題是,當對文本文件進行最初讀都有一個編號,有一個以上的數字返回,像這樣:

1 =信

12 =等於

2 =數字

777是第一個文本中的數字。

例。在最初的文字:B = 777

最終文本:1 12 2 7 2 7 2 7

當我真正想要的1 12 2 777

我知道我應該做的字符777到字符串,但我的困惑來自我如何得到那第一次,當我已經在我已經發布的循環中

我也有另一個單詞循環,這又是同樣的問題。

謝謝

import java.util.Scanner; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 

while(text.charAt(i)>='0'&&text.charAt(i)<='9') 
      { 
       log(Integer.toString(CONST)); 
       System.out.println(CONST); 
       char num =text.charAt(i); 
       System.out.println(num); 
       log(Character.toString(num)); 
       i++; 
      } 

回答

1

當你的代碼不工作,你應該做的第一件事是把它塑造成東西是可測試的,並寫一個失敗的測試。

我適應您的代碼是:

  • 刪除您沒有解釋的部分,或者看起來不相關(CONSTlog()
  • 使得寫入到任意Writer,而不是硬編碼System.out

所以:

private void consumeDigits(Writer writer, String text) throws IOException { 
     int i=0; 
     while (text.charAt(i) >= '0' && text.charAt(i) <= '9') { 
      char num = text.charAt(i); 
      writer.append(num); 
      i++; 
     } 
    } 

現在我可以寫一個測試。

@Test 
public void printStackTrace() throws IOException { 
    String text = "777abcdef"; 
    StringWriter writer = new StringWriter(); 
    consumeDigits(writer, text); 
    assertEquals(writer.toString(), "777"); 
} 

測試通過 - 所以無論您的代碼工作,或者我誤解了您的要求。但是,如果你遵循這種工作方法並寫出失敗的測試,那麼SO上的回答者可以更輕鬆地提供幫助。

+0

如果您不知道'@ Test'是什麼,那麼瞭解一下jUnit。它*非常*標準,它會拯救你的生命。 – slim