【问题标题】:How to remove specific object from ArrayList in Java?如何从 Java 中的 ArrayList 中删除特定对象?
【发布时间】:2012-01-21 04:35:29
【问题描述】:

如何从 ArrayList 中删除特定对象? 假设我有一个类如下:

import java.util.ArrayList;    
public class ArrayTest {
    int i;

    public static void main(String args[]){
        ArrayList<ArrayTest> test=new ArrayList<ArrayTest>();
        ArrayTest obj;
        obj=new ArrayTest(1);
        test.add(obj);
        obj=new ArrayTest(2);
        test.add(obj);
        obj=new ArrayTest(3);
        test.add(obj);
    }
    public ArrayTest(int i){
        this.i=i;
    }
}

如何从我的ArrayList&lt;ArrayList&gt; 中删除带有new ArrayTest(1) 的对象

【问题讨论】:

  • @Ripon\ @Sanu 。尝试使用 Iterator remove(); 方法。在迭代时从 ArrayList 中删除数学元素

标签: java arraylist


【解决方案1】:

ArrayList 基于equals(Object obj) 方法删除对象。所以你应该正确地实现这个方法。比如:

public boolean equals(Object obj) {
    if (obj == null) return false;
    if (obj == this) return true;
    if (!(obj instanceof ArrayTest)) return false;
    ArrayTest o = (ArrayTest) obj;
    return o.i == this.i;
}

或者

public boolean equals(Object obj) {
    if (obj instanceof ArrayTest) {
        ArrayTest o = (ArrayTest) obj;
        return o.i == this.i;
    }
    return false;
}

【讨论】:

    【解决方案2】:

    如果您使用的是 Java 8:

    test.removeIf(t -> t.i == 1);
    

    Java 8 在集合接口中有一个removeIf 方法。对于 ArrayList,它有一个高级实现(n 阶)。

    【讨论】:

      【解决方案3】:

      一般而言,可以通过两种方式从ArrayList(或通常任何List)中删除对象,按索引(remove(int))和按对象(remove(Object))。

      在这种特殊情况下:将equals(Object) 方法添加到您的ArrayTest 类。这将允许ArrayList.remove(Object) 识别正确的对象。

      【讨论】:

        【解决方案4】:

        要从 arrayList 中删除特定对象,有两种方法。调用arrayList函数。

        1. 根据对象移除。
        arrayList.remove(object);
        

        这将删除您的对象,但在大多数情况下,当 arrayList 包含 UserDefined DataTypes 的项目时,此方法不会为您提供正确的结果。它仅适用于原始数据类型。因为用户想根据对象字段值来删除项目,而删除函数无法自动比较。

        1. 根据arrayList 的指定索引位置删除。从 arrayList 中删除任何项目或对象的最佳方法。首先,找到要删除的项目的索引。然后调用这个arrayList方法,这个方法根据索引删除项目。它会给出正确的结果。
        arrayList.remove(index);  
        

        【讨论】:

          【解决方案5】:

          这里是完整的例子。我们必须使用 迭代器的 remove() 方法

          import java.util.ArrayList;
          import java.util.Iterator;
          
          public class ArrayTest {
              int i;
              public static void main(String args[]) {
                  ArrayList<ArrayTest> test = new ArrayList<ArrayTest>();
                  ArrayTest obj;
                  obj = new ArrayTest(1);
                  test.add(obj);
                  obj = new ArrayTest(2);
                  test.add(obj);
                  obj = new ArrayTest(3);
                  test.add(obj);
                  System.out.println("Before removing size is " + test.size() + " And Element are : " + test);
                  Iterator<ArrayTest> itr = test.iterator();
                  while (itr.hasNext()) {
                      ArrayTest number = itr.next();
                      if (number.i == 1) {
                          itr.remove();
                      }
                  }
                  System.out.println("After removing size is " + test.size() + " And Element are :" + test);
              }
              public ArrayTest(int i) {
                  this.i = i;
              }
              @Override
              public String toString() {
                  return "ArrayTest [i=" + i + "]";
              }
          
          }
          

          【讨论】:

            【解决方案6】:

            使用此代码

            test.remove(test.indexOf(obj));
            
            test is your ArrayList and obj is the Object, first you find the index of obj in ArrayList and then you remove it from the ArrayList.
            

            【讨论】:

            • 如果位置不规则,那么如何获取obj的索引。
            • 如果我不能理解你的观点,请原谅我。但是您不需要提供索引,您需要将对象传递给 indexOf 方法,它将返回对象索引,remove 方法将从 ArrayList 中删除该索引。如果你有相同值的重复对象,那么你需要在你的类中实现 equals 方法。
            • 但在这种情况下 indexOf(obj) 保留最后一个对象的索引值,即 ArrayTest(3).....所以它会删除最后一个对象
            • 使用此代码 'public void deleteObject(ArrayTest obj) { for(int i=0; i
            【解决方案7】:
            List<Object> list = new ArrayList();
            for (Iterator<Object> iterator = list.iterator(); iterator.hasNext();) {
              Object obj= iterator.next();
                if (obj.getId().equals("1")) {
                   // Remove the current element from the iterator and the list.
                   iterator.remove();
                }
            }
            

            【讨论】:

              【解决方案8】:
               private List<Employee> list = new ArrayList<>();
               list.removeIf(emp -> emp.getId() == 10);
              

              【讨论】:

              【解决方案9】:

              AValchev 是对的。 更快的解决方案是解析所有元素并通过唯一属性进行比较。

              String property = "property to delete";
              
              for(int j = 0; j < i.size(); j++)
              {
                  Student obj = i.get(j);
              
                  if(obj.getProperty().equals(property)){
                     //found, delete.
                      i.remove(j);
                      break;
                  }
              
              }
              

              这是一个快速的解决方案。您最好为较大的项目实施对象比较。

              【讨论】:

              • 如果要删除多个与属性匹配的对象怎么办?
              【解决方案10】:

              如果你想删除多个与属性匹配的对象,试试这个。

              我使用以下代码从对象数组中删除元素,这对我有帮助。

              一般而言,可以通过两种方式从ArrayList(或通常任何列表)中删除对象,index(remove(int))和object(remove(Object))。

              给你一些时间arrayList.remove(index)arrayList.remove(obj.get(index))使用这些行可能不起作用尝试使用以下代码。

              for (Iterator<DetailInbox> iter = detailInboxArray.iterator(); iter.hasNext(); ) {
                  DetailInbox element = iter.next();
                 if (element.isSelected()) {
                    iter.remove();
                 }
              }
              

              【讨论】:

                【解决方案11】:

                我已经试过了,它对我有用:

                ArrayList<cartItem> cartItems= new ArrayList<>();
                
                //filling the cartItems
                
                cartItem ci=new cartItem(itemcode,itemQuantity);//the one I want to remove
                
                Iterator<cartItem> itr =cartItems.iterator();
                while (itr.hasNext()){
                   cartItem ci_itr=itr.next();
                   if (ci_itr.getClass() == ci.getClass()){
                      itr.remove();
                      return;
                    }
                }
                

                【讨论】:

                  【解决方案12】:
                      ArrayTest obj=new ArrayTest(1);
                      test.add(obj);
                      ArrayTest obj1=new ArrayTest(2);
                      test.add(obj1);
                      ArrayTest obj2=new ArrayTest(3);
                      test.add(obj2);
                  
                      test.remove(object of ArrayTest);
                  

                  您可以指定如何控制每个对象。

                  【讨论】:

                    【解决方案13】:

                    您可以使用 Collections.binarySearch 查找元素,然后在返回的索引上调用 remove。

                    请在此处查看 Collections.binarySearch 的文档: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#binarySearch%28java.util.List,%20java.lang.Object%29

                    这需要 ArrayTest 对象实现 .equals 。您还需要调用 Collections.sort 对列表进行排序。最后,ArrayTest 必须实现 Comparable 接口,这样 binarySearch 才能正确运行。

                    这是在 Java 中执行此操作的“正确”方式。如果您只是想以一种快速而肮脏的方式解决问题,那么您可以遍历元素并删除具有您要查找的属性的元素。

                    【讨论】:

                      【解决方案14】:

                      这对我有帮助:

                              card temperaryCardFour = theDeck.get(theDeck.size() - 1);
                              theDeck.remove(temperaryCardFour);    
                      

                      而不是

                      theDeck.remove(numberNeededRemoved);
                      

                      我在代码的第一个 sn-p 上得到了删除构造,在第二个中得到了未删除构造。

                      尝试使用第一个 sn-p 切换您的代码,我认为这是您的问题。

                      内森·纳尔逊

                      【讨论】:

                        【解决方案15】:

                        简单使用 remove() 函数。并将对象作为您要删除的参数传递。 你的arraylist.remove(obj)

                        【讨论】:

                          【解决方案16】:

                          或者你可以使用 java 8 lambda

                          test.removeIf(i -> i==2);

                          它会简单地删除所有满足条件的对象

                          【讨论】:

                            【解决方案17】:

                            test ArrayList

                            中移除 ArrayTest(1) 时使用以下一个
                            test.removeIf(
                                 (intValue) -> {
                                     boolean remove = false;
                                     remove = (intValue == 1);
                                     if (remove) {
                                        //Success
                                     }
                                     return remove;
                                  });
                            

                            【讨论】:

                              【解决方案18】:

                              简单字符串列表中的示例,如果有人愿意的话:

                               public ArrayList<String> listAfterRemoved(ArrayList<String> arrayList, String toRemove) {
                              
                                      for (int i = 0; i < arrayList.size(); i++) {
                                          if (arrayList.get(i).equals(toRemove)) {
                                              arrayList.remove(toRemove);
                                          }
                                      }
                                      return arrayList;
                                  }
                              

                              电话是:

                              ArrayList<String> arrayList = new ArrayList<>();
                                      arrayList.add("1");
                                      arrayList.add("2");
                                      arrayList.add("3");
                                      arrayList.add("4");
                              
                                      System.out.println("Array List before: " + arrayList.toString());
                                      arrayList = listAfterRemoved(arrayList, "2");
                                      System.out.println("Array List after : " + arrayList.toString());
                              

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2015-08-05
                                • 2021-08-02
                                • 1970-01-01
                                • 2013-01-26
                                • 1970-01-01
                                • 1970-01-01
                                • 2010-11-21
                                相关资源
                                最近更新 更多