2010-07-18 4 views
1

누군가 다음과 같은 코드 조각에 대해 나에게 설명 할 수 있습니까?Arraylist 반복 중에 요소가 누락된다

public static void main(String[] args) { 
List<String> l = new ArrayList<String>(); 
    l.add("1"); 
    l.add("2"); 
    l.add("3"); 
    l.add("4"); 

    for (int i = 0; i < l.size(); i++) { 
    if(l.get(i).equals("1")) 
    l.remove(l.get(i)); 
    else 
    System.out.println(l.get(i)); 
    } 
} 

은 [2,3,4] 대신 [3.4]의 출력을 제공합니다. Wheres my [2]? 내가 .. ..

+0

왜 l.remove (i)를 사용할 수 있다면'l.remove (l.get (i))'를 사용하고 있습니까? – quantumSoup

답변

5

그 이유는 다음과 같습니다
난 = 0 첫 번째 요소를 제거하고 난 될 때
당신이 1로 모든 것을 아래로 이동했기 때문에 내가 = 1이, 세 번째 요소에서 지금 1 당신 때문에 전 = 2는이 세 번째 요소를 쓸 때 쓰기 "3"

"4", 당신에게 "3"의 출력주기 "4"

대체 구현 될 수 있습니다

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

public class Item { 
    public static void main(String[] args) { 
     List<String> l = new ArrayList<String>(); 
     l.add("1"); 
     l.add("2"); 
     l.add("3"); 
     l.add("4"); 

     Iterator<String> iter = l.iterator(); 
     while(iter.hasNext()) 
     { 
      String value = iter.next(); 
      if("1".equals(value)) 
      { 
       iter.remove(); 
      } 
      else 
      { 
       System.out.println(value); 
      } 
     } 
    } 
} 
+0

수동으로 인덱스 변수를 감소시키지 않으려면 가능한 한 항상 Iterator를 사용하여 요소를 제거해야합니다. 이 방법이 훨씬 안전합니다. 물론 당신은 항상 그것을 사용할 수는 없지만 할 수 있다면 해주십시오. –

2

당신이 l.remove를 호출 한 후 미리 :)에서

감사를 누군가가 설명 할 수 있다면 큰 목록의이 동작과 혼동 릴입니다, 현재 요소 (l.get(i))는 다음 요소 인 끝 ("2").
그러나 remove을 호출 한 후 루프를 계속 진행하고 요소를 건너 뜁니다. 내가 더 같은 구문을 제안 할 수있는 어떤 문제가

새로운 현재 요소가 (i++ 후) 다음 반복에 의해 처리됩니다 있도록이 문제를 해결하려면, 당신은 if 내부

1

SLaks을 i--을 추가 할 수는에 관해서는 정확 이.

int i=0; 
while(i < l.size()) 
{ 
    if(l.get(i).equals("1")) 
    l.remove(l.get(i)); 
    else 
    { 
    System.out.println(l.get(i++)); 
    } 
} 
+0

ok .. 반복자가 나를 위해 일을 했어.하지만 나중에. 엉터리 실수 ... 다시 감사합니다 :) – sharath

-1

다른 기능을 사용하면 원하는 기능을 사용할 수 있습니다.

List<String> l = new ArrayList<String>(); 
l.add("1"); 
l.add("2"); 
l.add("3"); 
l.add("4"); 

for (int i = 0; i < l.size(); i++) { 

    if(l.get(i).equals("1")) 
     l.remove(l.get(i)); 

    System.out.println(l.get(i)); 
} 
관련 문제