2017-11-07 6 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가 발생합니다 : 자바 힙 공간. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+3

하나의 입력 (루프 이전) 만 읽는 중입니다. – Eran

+1

그리고 0보다 큰 경우 무한 루프가됩니다 – bmarkham

+0

마음 속으로 코드를 실행하십시오. 예 : 사용자가 '5'를 입력합니다. '5> 0'이므로 while 루프를 시작합니다. 목록에'5 '를 추가합니다. '5! = 0'이므로 잠시 쉬지 않습니다. 루프 상태를 다시 확인하고 '5'는 여전히 '0'보다 큽니다. 목록에 다시 추가됩니다. 휴식 없음. 또 다른 루프 사이클. 문제가 보이니? :) 덕분에 – Oneiros

답변

1

루프

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

, 감사합니다! – annabretsko

2

적어도 하나를 수정하십시오> 실행 휴식에 필요한 = 0 :

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();