从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 2012年

1
您的逻辑有缺陷。当然,您不应该考虑每个项目的位置,而应该考虑项目本身。换句话说,你不想删除位置1,3 5,而是要删除的项目(无论他们在List使用)equals("B")equals("D")equals("F")。想一想。
Squonk

是的,我要删除项目,但是如何匹配项目。实际上,这些项目实际上是在ListView中,并且在选择后,我想从数据库和阵列中删除它,并刷新适配器和列表
Krishnakant Dalal 2012年

慢速选项:将元素添加到第二个列表后进行迭代,然后将第二个列表从第一个列表中删除(可选步骤:将第二个列表返回给调用者)
SparK

Answers:


133

在这种情况下,您应该按降序删除元素。第一个索引5,然后3,然后1。这将从列表中删除元素,而不会产生不良副作用。

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

1
OP的ArrayList包含Strings而不是Integers(不过,我同意您的看法)。
亚历克斯·洛克伍德

@Alex:这个答案可以用,但是和OP在他们的问题中的逻辑一样有缺陷。我们正在谈论ArrayList<E>-为什么有人要从ArrayList纯粹基于位置的位置删除对象,而不是测试该位置的内容?OP可能会String用作对象的类型,ArrayList但是即使解决了OP的特殊情况,您的回答也确实是泛型的不好编码实践。
Squonk

3
是的,我同意你的看法。但是OP问了ArrayList<String>,不是ArrayList<E>
Adrian Monk 2012年

我完全不同意这个答案,@ MisterSquonk相信,解决方案必须是通用的。此外,为什么我要投票?
Mohammed Azharuddin Shaikh'5

66
好,听着...我不知道有什么大不了的。OP发布了他的代码,我回答了一个可能的解决方案。很抱歉,我没有给出一个完全通用的解决方案,但是据我所知,OP并没有要求编程课程。他在问“为什么此代码不起作用?” 不要仅仅因为您对问题的理解不同而开始责怪我拒绝您的回答。
亚历克斯·洛克伍德

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中的Collection中删除对象是一种更好的做法,因为其他线程可能会修改同一Collection并可能导致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

我假设数组是升序排序的,这是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)方法删除列表中指定位置(索引)处的元素。删除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]);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.