2017-11-07 15 views
3

ユーザーの入力をリストに追加して、逆の順序で表示しようとしています。ユーザーはここに私のコードだ0に入るまでの要素が追加されます。リストに入力を追加する

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import java.util.Scanner; 

public class InputInArrrayList{ 
    public static void main(String[] args) { 
     Scanner s = new Scanner(System.in); 
     int a = s.nextInt(); 
     List<Integer> myList = new ArrayList<>(); 
     while(a > 0) { 
      myList.add(a); 
      if (a == 0){ 
       break; 
      } 
     } 
     Collections.reverse(myList); 
     System.out.println(myList); 
    } 
} 

しかし、それは代わりに0だと、ループが壊れていない、それはOutOfMemoryErrorが発生スロー:Javaヒープスペースを。私は間違って何をしていますか?

+3

1つの入力(ループの前)を読み取るだけです。 – Eran

+1

そして0より大きい場合は無限ループに入ります – bmarkham

+0

あなたの心の中であなたのコードを実行しようとしてください。例:ユーザが「5」を入力する。 '5> 0'なので、whileループに入ります。あなたはリストに '5'を追加します。 '5!= 0'なので、whileは壊れません。ループの状態をもう一度チェックして、「5」はまだ「0」より大きいです。それはリストに再び追加されます。休憩なし。別のループサイクル。あなたは問題が見えますか? :) – Oneiros

答えて

1

実行するための休憩のために必要な少なくとも1つのA> = 0あなたのループ

List<Integer> myList = new ArrayList<>(); 
while(true) { 
    int a = s.nextInt(); 
    if (a == 0){ 
     break; 
    } else 
     myList.add(a); 
    } 
+0

働いて、ありがとう! – annabretsko

2

を修正してください:

while(a > 0) { 
    myList.add(a); 
    if (a == 0){ 
     break; 
    } 
} 

として:あなたの問題は、以下のコードである

while(a >= 0) { 
     myList.add(a); 
     if (a == 0){ 
      break; 
     } 
    } 
1

最初のユーザー入力を読み取ってaに割り当てると、whileループが無限に実行されていることがわかります。これは、変数aである条件引数が決して変更されないために発生します。
したがって、その変数をwhileループ内で更新するコードの部分を挿入する必要があります。以下は、簡単な修正されています。最初の数に設定してから、ループし続けるにつれて

Scanner s = new Scanner(System.in); 
int a = 1; 
List<Integer> myList = new ArrayList<>(); 
while(a > 0) { 
    a = s.nextInt(); 
    if (a == 0) { 
     break; 
    } else { 
     myList.add(a); 
    }   
} 
0

現在、あなたが無限ループになっている、したがって、リストに同じ番号を追加し続けています。 whileループの中に追加する必要があります。 int a = s.nextInt();

関連する問題