从 ArrayList 中删除项目

Posted

技术标签:

【中文标题】从 ArrayList 中删除项目【英文标题】:Remove Item from ArrayList 【发布时间】:2012-05-29 15:56:36 【问题描述】:

我有一个 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]);

但是在数组的第一个项目被删除后被改变并且在下一次迭代中它删除了错误的元素或给出了异常。

【问题讨论】:

按索引的降序删除如何(对索引进行排序,然后先删除索引最高的元素)? 你的逻辑有缺陷。当然,您不应该考虑每个项目的位置,而应该考虑项目本身。换句话说,您不想删除位置 1、3 和 5,而是想使用 equals("B")equals("D")equals("F") 删除项目(无论它们在 List 中的什么位置)。想想吧。 是的,我想删除项目,但如何匹配项目。实际上,这些项目在 ListView 中,在选择时我想从 DB 和 Array 中删除它并刷新适配器和 List 慢速选项:将元素添加到第二个列表后迭代,从第一个列表中删除第二个列表(可选步骤:将第二个列表返回给调用者) 【参考方案1】:

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

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

【讨论】:

OP 的 ArrayList 包含 Strings,而不是 Integers(尽管如此,我同意您的观察)。 @Alex :这个答案会起作用,但它与 OP 在他们的问题中的逻辑一样有缺陷。我们正在谈论ArrayList&lt;E&gt; - 为什么有人想从ArrayList 中删除一个对象,纯粹基于位置而不是测试该位置的内容? OP 很可能使用 String 作为 ArrayList 的对象类型,但是即使它确实解决了 OP 的特定情况,你的答案对于泛型来说确实是糟糕的编码实践。 是的,我同意你的看法。但 OP 询问的是 ArrayList&lt;String&gt;,而不是 ArrayList&lt;E&gt; 我完全不同意这个答案,@MisterSquonk 你确信,解决方案必须是通用的。此外,为什么我会被否决? 好吧,听着……我不知道有什么大不了的。 OP 发布了他的代码,我回复了一个说明可能修复的答案。很抱歉,我没有给出一个完全通用的解决方案,但据我所知,OP 并没有要求上编程课。他在问“为什么这段代码不起作用?”不要仅仅因为你对问题的解释不同就开始指责我对你的答案投了反对票。【参考方案2】:

您可以使用ListIteratorArrayList 中删除元素,

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 中使用 ListIterator remove() 方法从 Collection 中删除对象是更好和更好的做法,因为可能有另一个线程正在修改同一个集合并可能导致 ConcurrentModificationException。【参考方案3】:
 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);

    

【讨论】:

【参考方案4】:

如前所述

iterator.remove()

可能是在循环期间删除列表项的唯一安全方法。

要更深入地了解使用迭代器删除项目,请尝试查看thread

【讨论】:

我不赞成投票,我完全同意你的看法。这是最安全的方法。【参考方案5】:

我假设数组 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++;

【讨论】:

【参考方案6】:
String[] mString = new String[] "B", "D", "F";

for (int j = 0; j < mString.length-1; j++) 
        List_Of_Array.remove(mString[j]);

【讨论】:

【参考方案7】:

这个怎么样?想一想-

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]

【讨论】:

【参考方案8】:

试试这个方法,

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]);

【讨论】:

【参考方案9】:

如果您使用“=”,则会为第二个中的原始数组列表创建一个副本,但引用是相同的,因此如果您更改一个列表,另一个也会被修改。用这个代替“=”

        List_Of_Array1.addAll(List_Of_Array);

【讨论】:

【参考方案10】:

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]);

【讨论】:

【参考方案11】:

如果您需要删除列表中的最终项目,可以使用此代码

 if(yourList.size() != 0)
   yourList.remove(yourList.size()-1);
 

或者您可能需要在选择列表中的项目后删除一段时间

if(selected)// boolean for checked add or remove
   yourList.add(position , id); // add to list by position can use your list position
else
   if(yourList.size() != 0) 
   yourList.remove(position);
 

【讨论】:

以上是关于从 ArrayList 中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

更新 ArrayList 适配器

从 ArrayList 中删除项目

从 ArrayList 中删除项目时出错 [重复]

ArrayList

Arraylis类

源码面经Java源码系列-ArrayList与LinkedList