2012-03-23 4 views
0

내 Android 앱 Java 코드에 ArrayList의 맞춤 데이터 유형이 있습니다. ArrayList.remove(location) 위의 위치에있는 모든 항목을 수행 할 때 내가 알고있는 것에서부터 ArrayLists에 대해 하나씩 이동합니다. 하지만 어떤 이유로 배열의 선택된 항목을 제거하기 위해 배열의 끝에서부터 시작까지 반복 할 때마다 그 아래의 모든 항목이 제거되고 상위 항목이 정상적으로 작동하는 대신 하나 위로 이동합니다 하나가 내려 갔다. 따라서 배열 중간에서 첫 번째 항목을 제거하면 0의 항목이 1로 이동하고 0이 null이됩니다. 특히 내가 할 수있는 일이나 이것이 일어날 수있는 어떤 상황이 있습니까?ArrayList에서 항목을 제거 할 때 예기치 않은 동작이 발생했습니다.


정확하게 내가 무엇을하고 있었는지에 대해 사과드립니다. Im은 ArrayList를 반복하지 않습니다. 대신에 삭제해야 할 원래 목록에있는 모든 항목을 포함하는 다른 목록이 있습니다. 두 번째 목록에서 Collections.sort를 수행하고 두 번째 목록에서 시작하여 각 반복마다 ArrayList.remove를 수행하고 첫 번째 목록을 두 번째 목록에서 읽은 위치와 함께 수행합니다. 따라서 제거는 가장 높은 위치에서 가장 낮은 위치로 이동하지만 각 제거에서 더 낮은 항목이 발생하는 것을 방지합니다. 하지만 내가보고있는 것은 제거 된 항목보다 낮은 항목들이 모두 간격을 채우기 위해 위로 이동하는 것입니다. 왜 이런 일이 일어 났습니까?

+0

이러한 상황은 안드로이드에만있는 것이 아니라 일반적으로 자바에 적용됩니다. – Bernard

+0

코드를 표시하십시오. 당신이하는 일을 묘사하는 것보다 더 분명합니다. 그리고 코드가 더 중요한 것은 할 일을하지 않을 수도 있습니다. –

+0

@FabianBarney : 귀하가 질문을 끝내기 위해 투표 할 때 자동으로 생성되는 의견입니다. 나는 그것을 쓰지 않았다, 정직한 guv! –

답변

3

목록을 반복하면서 목록에서 항목을 제거해야하는 경우 Iterator 및 while 루프를 사용해보십시오. Iterator 인터페이스는 반복되는 컬렉션에서 next()으로 검색된 마지막 항목을 삭제하는 remove() 메서드를 정의합니다.

List list = new ArrayList(); 
Iterator iter = list.iterator(); 

while (iter.hasNext()) 
{ 
    Object item = iter.next(); 

    if (shouldDelete(item)) 
    { 
    iter.remove(); 
    } 
} 
1

두 번째 목록 만 정렬하는 것처럼 보이므로 결과에 놀라지 않습니다. 첫 번째 목록은 정렬되지 않으므로 반대 순서로 반복하지 않으므로 이상한 교대가 예상 될 수 있습니다.

목록 반복기를 사용하여 첫 번째 목록을 살펴보고 항목이 두 번째 목록에 포함되어 있으면 이터레이터를 사용하여 첫 번째 목록에서 제거하십시오.

또는 더 나은 방법은 ArrayList#removeAll<Collection<?> c) 방법을 사용하십시오. 나 목록의 중간 어딘가에 항목을 제거 할 때

2

때문에, 0에서 1로 이동하고, 0의 항목은 null된다. 왜 이런 일이 일어나는 걸까요?

그런 일은 일어나지 않아야합니다. 다른 것은 잘못되었습니다. SSCCE을 게시하십시오.

난 당신이 그러나 같은 그것을 해결하는 것이 좋습니다 :

firstList.removeAll(secondList); 
관련 문제