2011-11-17 4 views
1

그래서이 배열을 가지고 길이가 2 또는 4 문자 인 문자열 (2 또는 4 문자를 포함하는 문자열)을 삭제하려고합니다. 나는이 방법을 사용하고 있으며 논리적으로는 효과가 있지만 작동하지 않습니다.특정 길이의 문자열을 제거하는 방법

public static void main(String[] args) 
{ 
    ArrayList<String> list = new ArrayList<String>(); 
    list.add("This"); 
    list.add("is"); 
    list.add("a"); 
    list.add("test"); 
    for (int i=0; i<list.size(); i++) 
    { 
     if(list.get(i).length()==2 || list.get(i).length()==4) 
     { 
      list.remove(i); 
     } 

    } 
} 

나는이 방법을 고집하고 싶습니다. 이 코드를 수정하는 방법에 대한 제안을 해주실 수 있습니까?

이 코드의 출력 나는 그것이 실행

[is, a] 

을 나는 "입니다"때문에 출력이

[a] 

되고 싶어요 비록 2 자입니다.

답변

7

목록이 변경됩니다. 마지막 요소에서 처음으로 반복하거나 반복자를 사용하십시오.

+0

예, 성공했습니다. 감사합니다 –

+1

잘 대답을 받아들이 :-)하지만 bringer128의 답변에 표시된이 경우 iterator의 사용을 선호하지만 – aishwarya

6

PeterPeiGuo가 맞습니다. 색인을 이동시키는 요소를 제거하고 있습니다.

이것은 반복기의 주요 후보입니다.

Iterator<String> it = list.iterator(); 
while(it.hasNext()) { 
    String val = it.next(); 
    if(val.length() == 4 || val.length() == 2) { 
    it.remove(); 
    } 
} 
0

목록에서 항목을 삭제하면 목록에있는 나머지 항목의 색인이 변경됩니다.

코드가 실행되면 첫 번째 반복에서 i는 0이고 0에서 "this"항목을 삭제합니다. 두 번째 반복에서 i는 1이므로 0 인 값을 확인하지 않습니다. "this"가 삭제 되었기 때문에 지금은 "is"입니다.

PeterPeiGui가 대답 한 바에 따르면,이 특별한 경우에는 뒤로 돌아가는 것만으로도 문제를 해결할 수 있지만 컬렉션을 뒤져서 동시에 돌연변이 시키면 항상 많은 혼란이 야기 될 수 있습니다.

1

다른 옵션 : 하나를 제거하면 색인을 1 줄입니다. 그건 그렇고, 작동하지만 좋은 코딩 스타일은 아닙니다.

for (int i=0; i<list.size(); i++) 
{ 
    if(list.get(i).length()==2 || list.get(i).length()==4) 
    { 
     list.remove(i); 
     i--; 
    } 
} 
관련 문제