2016-09-27 9 views
0

イテレータに問題があります。プログラムは要素を受け入れ、格納します。表示するとクラッシュします。なぜこれが起こるのですか?そして、要素を表示する正しい方法は何ですか?2次元arraylistにデータを格納し、それをダブルイテレータで表示する方法は?

public static void main(String[] args){ 
    Scanner sc = new Scanner(System.in); 
    int num; 
    String dec; 
    ArrayList<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>(); 

    while(true){ 
     ArrayList<Integer> al2 = new ArrayList<Integer>(); 
     while (true){ 
      System.out.print("Enter a number to store in inner arraylist or zero to exit inner arraylist:\t"); 
      num = sc.nextInt(); 

      if (num!=0){ 
       al2.add(num); 
      }else{ 
       break; 
      } 
     } 
     al.add(al2); 
     System.out.print("Exit(Y/y):\t"); 
     dec=sc.next(); 
     if(dec.equals("Y") || dec.equals("y")){ 
      Iterator<ArrayList<Integer>> it = al.iterator(); 
      Iterator<Integer> it2 = al2.iterator(); 
      while(it.hasNext()){ 
       while(it2.hasNext()){ 
        System.out.print(it2.next() + " "); 
       } 
       System.out.println(); 
      } 
      break; 
     } 
    } 

    sc.close(); 

} 
+2

スタックトレースを取得しましたか?それは何と言ったのですか? – shmosel

答えて

0

を用いることであろうということですそれぞれの反復で内部イテレータを作成する必要があります。外側ループ。個々の配列リストに束縛されているので、それを再利用することはできません。外側のループが次のイテレータをフェッチするとき、元のit2は役に立たなくなります。ここでも外側のループ内に作成します。次のようなもの:

if(dec.equals("Y") || dec.equals("y")){ 
    Iterator<ArrayList<Integer>> it = al.iterator(); 
    // Iterator<Integer> it2 = al2.iterator(); 
    while(it.hasNext()){ 
     ArrayList<Integer> myList = it.next(); 
     Iterator<Integer> it2 = myList.iterator(); 
     while(it2.hasNext()){ 
      System.out.print(it2.next() + " "); 
     } 
     System.out.println(); 
    } 
    break; 
} 
+0

ありがとう、それは働いた。 –

1

問題がまだ最後の値

を指しているときに

Iterator<Integer> it2 = al2.iterator(); 

al2を行う簡単な方法は、このfor構文に

for (ArrayList<Integer> outer : al) { 
    for (ArrayList<Integer> inner : outer) { 
     System.out.print(inner + " "); 
    } 
} 
+0

本当に簡単です! 1 + –

関連する問題