2012-02-13 9 views
1

テキストファイルがあります。文字列トークナイザで分割しようとしています。ここでは、テキストファイルの数行です:最初の行の後に文字列トークナイザが停止する

Mary Smith 1 
James Johnson 2 
Patricia Williams 3 

私は名、姓と顧客IDに解散しようとしています。

私はこれまでこれを行うことができましたが、マリー・スミスの後で停止します。あなたはあなたのすべてがオフにトークンを投げるために起こっているように、ループの外でのfirstNameを持って、具体的方法を、

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

答えて

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

+0

ありがとうございました。そして、これは正しいように見えますが、今は空白行を印刷しているだけです。1 – Sackling

+0

私は馬鹿です。魅力のように働いた。ありがとうございました! – Sackling

0

まず第一に、あなたはあなたのループを見てみたい:

は、ここに私のコードです。あなたは十分な情報なしで新しい顧客オブジェクトを作成しようとしています。

3
String StringToBreak = infileCust.readLine(); 

は、ファイルからFIRST行を読み取ります。そしてあなたはStringTokenizerにそれを与えます。 StringTokenizedがそれ以上のトークンを見つけられないのは正常です。

をすべての行に読み込むには、これをすべて囲む2番目のループを作成する必要があります。これは:

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

実際には、3つの異なるフィールドがあるため、内部ループを実行する必要はありません。外側のループのために

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

私はあなたが完全に言っていることを得るが、私は外側のループを書くのに問題があります。 while(infileCust.readLine()!= null){ – Sackling

+0

現在の行を消費するのはどういう意味ですか? – Sackling

+0

また、最後には内部ループが必要ないと言っているので、トークナイザにその行を "消費"するように指示する必要があると推測していますが、方法がわからず、見つからないようです。 – Sackling

関連する問題