Удалить элемент из ArrayList


100

У меня есть ArrayListпредположение list, и у него 8 элементов AH, и теперь я хочу удалить элемент 1,3,5 позиции, хранящийся в массиве int, из того, listкак я могу это сделать.

Я пытаюсь сделать это с

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, и при выборе я хочу удалить это из БД и массива, а также обновить адаптер и список
Кришнакант Далал

Медленный вариант: итерация один раз, добавляя элементы во второй список, итерация второго списка, удаляя из первого (необязательный шаг: вернуть второй список вызывающему)
SparK

Ответы:


134

В этом конкретном случае вы должны удалять элементы в порядке убывания. Первый индекс 5, затем 3, затем 1. Это удалит элементы из списка без нежелательных побочных эффектов.

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

1
ArrayList OP содержит Strings, а не Integers (тем не менее, я согласен с вашим наблюдением).
Alex Lockwood

@Alex: Этот ответ будет работать, но он так же ошибочен, как и логика OP в их вопросе. Мы говорим о том, ArrayList<E>зачем кому-то удалять объект из позиции, ArrayListоснованной исключительно на позиции, вместо проверки того, что находится в этой позиции? OP вполне может использоваться Stringв качестве типа объекта для, ArrayListно ваш ответ - действительно плохая практика кодирования для дженериков, даже если он действительно решает конкретную ситуацию OP.
Squonk

3
Да, я согласен с тобой. Но ОП спрашивал ArrayList<String>, а не ArrayList<E>.
Адриан Монк

Я полностью не согласен с этим ответом, @MisterSquonk, я убежден, решение должно быть общим. Более того, почему я получаю голос против?
Мохаммед Ажаруддин Шейх

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

Лучше всего использовать метод ListIterator remove () для удаления объектов из коллекции в Java, потому что может быть вероятность, что другой поток изменяет ту же коллекцию и может привести к исключению 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

Если вы используете «=», реплика будет создана для исходного массива во втором списке, но ссылка останется такой же, поэтому, если вы измените один список, другой также будет изменен. Используйте это вместо "="

        List_Of_Array1.addAll(List_Of_Array);

2

Метод remove (int index) arrayylist удаляет элемент в указанной позиции (индексе) в списке. После удаления элементов arrayylist все последующие элементы перемещаются влево.

Означает, что в arraylist есть {20,15,30,40}

Я назвал метод: arrayylist.remove (1)

тогда данные 15 будут удалены, а 30 и 40 эти два элемента будут сдвинуты влево на 1.

По этой причине вы должны сначала удалить элемент с более высоким индексом arrayylist.

Итак .. для данной ситуации .. код будет ..

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]);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.