2012-02-13 38 views
1

我有一個文本文件我正在嘗試與字符串標記器分離。這裏是幾行文本文件:字符串標記停止在第一行後

Mary Smith 1 
James Johnson 2 
Patricia Williams 3 

我想分解成名字,姓氏和客戶ID。

到目前爲止,我已經能夠做到這一點,但它停止後,瑪麗史密斯。

這裏是我的代碼:

public static void createCustomerList(BufferedReader infileCust, 
      CustomerList customerList) throws IOException 
{  


      String firstName; 
      String lastName; 
      int custId; 


      //take first line of strings before breaking them up to first last and cust ID 
      String StringToBreak = infileCust.readLine(); 
      //split up the string with string tokenizer 
      StringTokenizer st = new StringTokenizer(StringToBreak); 

      firstName = st.nextToken(); 

      while(st.hasMoreElements()) 
      { 
      lastName = st.nextToken(); 
      custId = Integer.parseInt(st.nextToken()); 
      CustomerElement CustomerObject = new CustomerElement(); 
      CustomerObject.setCustInfo(firstName,lastName,custId); 
      customerList.addToList(CustomerObject); 

      } 


    } 
+2

我應該爲每個變量聲明使用camelCase。在你的代碼中'StringToBreak'和'CustomerObject'具有大寫字母,並且保留給類型(類和接口)。它有效,但會導致混淆。 – helios 2012-02-13 16:59:09

回答

1

對於外環,你需要存儲在stringToBreak變量的當前行的內容,這樣就可以在循環中訪問它。 您需要爲每一行添加一個新的StringTokenizer,因此它需要位於循環中。

String stringToBreak = null; 
while ((stringToBreak = infileCust.readLine()) != null) { 
    //split up the string with string tokenizer 
    StringTokenizer st = new StringTokenizer(stringToBreak); 
    firstName = st.nextToken(); 
    lastName = st.nextToken(); 
    custId = Integer.parseInt(st.nextToken()); 
} 
+0

我必須添加StringTokenizer st = new StringTokenizer(stringToBreak);在while循環之前還有沒有? 我收到一個錯誤:線程「main」中的異常java.lang.NullPointerException – Sackling 2012-02-13 19:02:28

+0

感謝您的編輯。這看起來是正確的,但現在它只是打印空白行而不是1 – Sackling 2012-02-14 00:17:02

+0

沒關係我是個白癡。像魅力一樣工作。謝謝! – Sackling 2012-02-14 01:06:38

0

首先,你要看看你的循環,你具體是怎麼擁有的firstName循環,這樣會扔你們令牌關閉之外。您將嘗試在沒有足夠信息的情況下創建新的客戶對象。

3
String StringToBreak = infileCust.readLine(); 

從文件讀取第一行。你可以用它來提供StringTokenizer。這是正常的,StringTokenized沒有發現更多的令牌。

您必須創建第二個循環,將所有這些讀取,每一行。它是:

outer loop: readLine until it gets null { 
    create a StringTokenizer that consumes *current* line 
    inner loop: nextToken until !hasMoreElements() 
} 

嗯,事實上,你不需要做一個內循環,因爲你有三個不同的領域。這是足以與:

name = st.nextToken(); 
lastName = st.nextToken(); 
id = st.nextToken; 
+0

好吧,我完全明白你的意思,但我在編寫外部循環時遇到了麻煩。我的outter循環幾乎就是這樣:while(infileCust.readLine()!= null){ – Sackling 2012-02-13 17:34:51

+0

消耗當前行是什麼意思? – Sackling 2012-02-13 18:48:02

+0

也在最後你說我不需要一個內部循環,所以我猜我只需要告訴標記器「消費」的線,但我不知道該方法,似乎無法找到一個.. – Sackling 2012-02-13 18:53:47

相關問題