ArrayList에서 항목 제거


100

나는 ArrayList가정 list하고 8 개의 항목 AH를 가지고 있으며 이제 list어떻게 할 수 있는지 에서 int 배열에 저장된 1,3,5 위치 항목을 삭제하고 싶습니다 .

나는 이것을 시도하고있다

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = 0; j < i.length; j++) {
    list.remove(i[j]);
}

그러나 첫 번째 항목 삭제 후 배열의 위치가 변경되고 다음 반복에서 잘못된 요소를 삭제하거나 예외가 발생합니다.


인덱스의 내림차순으로 제거하는 것은 어떻습니까 (인덱스를 정렬 한 다음 인덱스가 가장 높은 요소를 먼저 제거)?
nhahtdh

1
당신의 논리에 결함이 있습니다. 확실히 당신은 각 항목의 위치에 대해 생각하지 말고 대신 항목 자체에 대해 생각해야합니다. 즉, 위치 1, 3, 5를 제거하지 않는 대신 당신은 (그들이 어디에 있든 항목을 제거 할 List)를 사용하여 equals("B"), equals("D")equals("F"). 생각해보세요.
Squonk

예 항목을 삭제하고 싶지만 항목을 어떻게 일치시킬 수 있습니까? 실제로이 항목은 ListView에 있으며 선택시 DB 및 어레이에서이 항목을 삭제하고 어댑터와 목록을 새로 고치고
싶습니다

느린 옵션 : 두 번째 목록에 요소를 추가 한 후 반복하고 첫 번째 목록에서 제거하는 두 번째 목록을 반복합니다 (옵션 단계 : 두 번째 목록을 호출자에게 반환)
SparK

답변:


134

이 경우 내림차순으로 요소를 제거해야합니다. 첫 번째 인덱스 5, 다음 3, 다음 1. 이렇게하면 원하지 않는 부작용없이 목록에서 요소가 제거됩니다.

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}

1
OP의 ArrayList에는 Strings가 아닌 Integers 가 포함되어 있습니다 (하지만 귀하의 관찰에 동의합니다).
Alex Lockwood

@Alex :이 답변은 작동하지만 질문의 OP 논리만큼 결함이 있습니다. 우리는 ArrayList<E>ArrayList그 위치에있는 것을 테스트하는 대신 순전히 위치에 기반 하여 객체를 제거하고 싶어 할까요? OP는 String객체 유형으로 잘 사용될 수 ArrayList있지만 OP의 특정 상황을 해결하더라도 제네릭에 대한 대답은 실제로 나쁜 코딩 관행입니다.
Squonk

3
그래 나도 너와 같은 생각이야. 그러나 영업 이익에 대해 질문 ArrayList<String>하지 ArrayList<E>.
Adrian Monk

나는이 대답에 완전히 동의하지 않습니다. @ MisterSquonk 나중에 확신합니다. 솔루션은 일반적이어야합니다. 또한 내가 왜 반대표를 받는가?
Mohammed Azharuddin Shaikh

66
좋아, 들어 봐 ... 난 그게 뭔지 모르겠어. OP는 그의 코드를 게시했으며 가능한 수정 사항을 설명하는 답변으로 응답했습니다. 나는 완전히 일반적인 해결책을 제공하여 그 이상으로 나아 가지 못해 미안하지만 ... 내가 말할 수있는 한 OP는 프로그래밍 수업을 요구하지 않았습니다. 그는 "이 코드가 작동하지 않는 이유는 무엇입니까?"라고 물었습니다. 당신이 질문을 다르게 해석했다고해서 당신의 대답에 반대표를 던졌다 고 저를 비난하지 마십시오.
Alex Lockwood

30

, ArrayList사용 ListIterator에서 요소를 제거 할 수 있습니다 .

ListIterator listIterator = List_Of_Array.listIterator();

 /* Use void remove() method of ListIterator to remove an element from List.
     It removes the last element returned by next or previous methods.
 */
listIterator.next();

//remove element returned by last next method
listIterator.remove();//remove element at 1st position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 3rd position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 5th position

Java의 Collection에서 객체를 제거하기 위해 ListIterator remove () 메서드를 사용하는 것이 더 좋고 좋은 방법입니다. 다른 스레드가 동일한 컬렉션을 수정하고 ConcurrentModificationException으로 이어질 수 있기 때문입니다.
Min2

10
 public void DeleteUserIMP(UserIMP useriamp) {
       synchronized (ListUserIMP) {
            if (ListUserIMP.isEmpty()) {
            System.out.println("user is empty");
        }  else {
            Iterator<UserIMP> it = ListUserIMP.iterator();
            while (it.hasNext()) {
                UserIMP user = it.next();
                if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) {
                    it.remove();
                    System.out.println("remove it");
                }
            }
            // ListUserIMP.remove(useriamp);

            System.out.println(" this user removed");
        }
        Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK;
        // System.out.println("This user Deleted " + Constants.MESSAGE_OK);

    }
}

7

전에 언급했듯이

iterator.remove()

루프 중에 목록 항목을 제거하는 유일한 안전한 방법 일 수 있습니다.

반복자를 사용한 항목 제거에 대한 더 깊은 이해를 위해이 스레드 를보십시오.


나는 찬성표를 어리둥절합니다. 나는 당신에게 전적으로 동의합니다. 이것이 가장 안전한 방법입니다.
Simmant

3

배열 i가 오름차순 정렬되었다고 가정하고 여기에 Iterator를 사용한 또 다른 솔루션이 있으며 더 일반적입니다.

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

Iterator<String> itr = list.iterator();
int pos = 0;
int index = 0;
while( itr.hasNext() ){
    itr.next();
    if( pos >= i.length ){
        break;
    }
    if( i[pos] == index ){
        itr.remove();
        pos++;
    }

    index++;
}

2

이건 어때요? 그냥 생각 해봐-

import java.util.ArrayList;

class Solution
{
        public static void main (String[] args){

             ArrayList<String> List_Of_Array = new ArrayList<String>();
             List_Of_Array.add("A");
             List_Of_Array.add("B");
             List_Of_Array.add("C");
             List_Of_Array.add("D");
             List_Of_Array.add("E");
             List_Of_Array.add("F");
             List_Of_Array.add("G");
             List_Of_Array.add("H");

             int i[] = {1,3,5};

             for (int j = 0; j < i.length; j++) {
                 List_Of_Array.remove(i[j]-j);
             }

             System.out.println(List_Of_Array);

        }


}

그리고 출력은-

[A, C, E, G, H]

2

이런 식으로 시도해보세요.

ArrayList<String> List_Of_Array = new ArrayList<String>();
List_Of_Array.add("A");
List_Of_Array.add("B");
List_Of_Array.add("C");
List_Of_Array.add("D");
List_Of_Array.add("E");
List_Of_Array.add("F");
List_Of_Array.add("G");
List_Of_Array.add("H");

int i[] = {5,3,1};

for (int j = 0; j < i.length; j++) {
    List_Of_Array.remove(i[j]);
}


2

"="를 사용하면 두 번째 목록의 원래 arraylist에 대한 복제본이 생성되지만 참조가 동일하므로 한 목록에서 변경하면 다른 목록도 수정됩니다. "="대신 사용

        List_Of_Array1.addAll(List_Of_Array);

2

arraylist의 remove (int index) 메소드는 목록의 지정된 위치 (index)에있는 요소를 제거합니다. arraylist 항목을 제거한 후 모든 후속 요소는 왼쪽으로 이동합니다.

arraylist에 {20,15,30,40}이 포함되어 있음을 의미합니다.

메서드를 호출했습니다 : arraylist.remove (1)

그러면 데이터 15가 삭제되고 30 & 40이 두 항목이 1만큼 왼쪽으로 이동합니다.

따라서 먼저 arraylist의 상위 인덱스 항목을 삭제해야합니다.

그래서 .. 당신의 주어진 상황에 대해 .. 코드는 ..

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.