Видалити елемент з 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"). Подумай над цим.
Сквонк

Так, я хочу видалити Елемент, але як я можу зіставити елементи. Насправді реально ці елементи знаходяться у ListView, а при виборі я хочу видалити це з DB та Array та оновити адаптер та List
Krishnakant Dalal

Повільний варіант: повторіть додавання елементів до другого списку, повторіть другий список, видаливши його з першого (необов'язковий крок: поверніть другий список абоненту)
SparK

Відповіді:


134

У цьому конкретному випадку слід видалити елементи у порядку зменшення. Спочатку індекс 5, потім 3, потім 1. Це видалить елементи зі списку без небажаних побічних ефектів.

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

1
ArrayList ОП містить Strings, не Integers (проте я згоден з вашим спостереженням).
Алекс Локвуд

@Alex: Ця відповідь спрацює, але така ж помилкова, як логіка ОП у їхньому питанні. Ми говоримо про ArrayList<E>те, чому б хто-небудь хотів видалити об'єкт із ArrayListчистого положення, а не перевіряти те, що знаходиться в цій позиції? ОП цілком може використовуватись Stringяк тип об'єкта, ArrayListале ваша відповідь - це дуже погана практика кодування для дженериків, навіть якщо це вирішує конкретну ситуацію ОП.
Сквонк

3
Так, я згоден з вами. Але ОП запитав про це ArrayList<String>, ні ArrayList<E>.
Адріан Монк

Я повністю не згоден з цією відповіддю, @MisterSquonk переконаний, рішення має бути загальним. Крім того, чому я отримую низьку оцінку?
Мухаммед Ажаруддін Шейх

66
Гаразд, слухай ... Я не знаю, у чому полягає велика справа. ОП розмістила його код, і я відповів відповіддю, що ілюструє можливий виправлення. Вибачте, що не пішов вище та далі, давши цілком загальне рішення ... але, наскільки я можу сказати, ОП не просила уроку програмування. Він запитував "чому цей код не працює?" Не починайте звинувачувати мене в тому, що я відповідав голосом за те, що ви по-різному трактували питання.
Алекс Локвуд

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.
Мін2,

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

метод видалення (int index) методу 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]);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.