2016-04-27 11 views
-1

StringTokenizer結果をArrayListにします。私は次のコードを使用し、最初の印刷ステートメントでは、stok.nextToken()正しい値を印刷します。しかし、ArrayListの2番目のprint文では、エラーがjava.util.NoSuchElementExceptionと表示されます。 これらの結果をArrayListにどのように取り込みますか?StringTokenizerの結果をJavaのArrayListに取り込む方法は?

import java.io.BufferedReader; 
    import java.io.InputStreamReader; 
    import java.util.ArrayList; 
    import java.util.StringTokenizer; 

     public class Test { 
     public static void main(String[] args) throws java.io.IOException { 

      ArrayList<String> myArray = new ArrayList<String>(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      System.out.print("Enter : "); 
      String s = br.readLine(); 
      StringTokenizer stok = new StringTokenizer(s, "><"); 
      while (stok.hasMoreTokens()) 
       System.out.println(stok.nextToken()); 
      // -------until now ok 

      myArray.add(stok.nextToken()); //------------??????????? 
      System.out.println(myArray); 

     } 
    } 
+1

あなたの 'while'ステートメントを見てください。実行がループを終了すると、それは 'stok'の意味ですか? – Savior

+0

お返事ありがとうございました。では、この結果をArrayListにどのように取り込むのですか? – Emalka

+1

'stok'はwhileループによって完全に読み込まれているので、ループが完了した後に' nextToken() 'を呼び出すともちろん、(end-of-data)エラーがスローされます。ループの中で 'add()'を呼び出すつもりでしたか?もしそうなら、あなたは{中括弧}をいくつか欠いています。そうでなければ、あなたは何をしようとしていますか?質問を編集して説明してください。 – Andreas

答えて

-1
ArrayList<String> myArray = new ArrayList<String>();   
while (stok.hasMoreTokens()){ 
myArray.add(stok.nextToken()); 
} 

例外で結果とのSystem.out.printlnでのArrayListをプリントアウトが文句を言わないあなたがforループを使用する必要が役立つことをwhileループの外stock.nextTokenを呼び出してはいけません。 StringTokenizerのjavadocを引用

for(String s : myArray){ 
System.out.Println(s); 
} 
+0

お返事ありがとうございます。 – Emalka

+0

あなたは大歓迎です! – Priyamal

+0

私のコメントがどこに行きましたか分かりませんが、ArrayListを印刷するとメモリの場所が得られません**。リストのすべての要素が出力されます。 'List @ 5ad6521c'のような出力はメモリ位置ではなく**ハッシュコード**なので、そうでないとしてもメモリ位置は表示されません!! – Andreas

3

StringTokenizerその使用が新しいコードに落胆しているが、互換性の理由のために保持されているレガシークラスです。この機能を求める人は、splitメソッドをStringまたはjava.util.regexパッケージを使用することをお勧めします。

「新しいコード」は、Java 1.4以降で書かれたもの、つまり古代のものを意味します。


whileループはトークナイザからすべての値を抽出します。 の後にが既にすべてのトークンを抽出した後に、例外が発生したことに驚いたのはなぜですか?

は特にnextToken()のjavadocのからこの引用を与えられた:このトークナイザの文字列内にこれ以上トークンが存在しない場合

NoSuchElementExceptionをスローします。

おそらくこれを行うことを意味しましたか?

ArrayList<String> myArray = new ArrayList<>(); 
StringTokenizer stok = new StringTokenizer(s, "><"); 
while (stok.hasMoreTokens()) { 
    String token = stok.nextToken(); // get and save in variable so it can be used more than once 
    System.out.println(token); // print already extracted value 
    // more code here if needed 
    myArray.add(token); // use already extracted value 
} 
System.out.println(myArray); // prints list 
+0

あなたの返事ありがとうございます。私は中括弧を逃してしまった。 – Emalka

+1

あなたは中括弧を見逃していませんでした。 'add()'呼び出しはインデントされていないので、コードの* intent *も表示しませんでした。インデントは、コードの読者にとって非常に重要です。コードが質問に書かれているように、コードが何をしたいのかははっきりしていませんでした。不足している括弧は問題の中で最も少なかった。 – Andreas

関連する問題