【问题标题】:Remove object from ArrayList with some Object property使用某些 Object 属性从 ArrayList 中删除对象
【发布时间】:2016-07-01 22:31:22
【问题描述】:

我正在维护一个ArrayList 对象。我的对象结构是 ID、名称和其他一些细节。我需要删除一个具有某些 id 值 say(10) 的对象,并且我不想遍历列表。有什么解决办法吗?

【问题讨论】:

    标签: java loops object arraylist


    【解决方案1】:

    使用 Java-8 Collection#removeIf

    myList.removeIf(obj -> obj.id == 10);
    

    对于 Java-7,您必须使用迭代器:

    for(Iterator<MyType> iterator = myList.iterator(); iterator.hasNext(); ) {
        if(iterator.next().id == 10)
            iterator.remove();
    }
    

    请注意,列表迭代在任何情况下都是必要的。在 Java-8 removeIf 方法中,它只是在内部执行。

    【讨论】:

    • @Tagir Valeev 非常感谢您的有效回复。没有迭代有什么办法吗???
    • @django 检查 Java-8 的可能性。
    • 这两个都涉及迭代列表。
    • @Tagir Valeev ..Ya 它正在工作。还有一个疑问,我需要获取 id=10 的对象,而不是删除。我该怎么办?
    【解决方案2】:

    也许我不明白这个问题,但为什么没有人建议为该用户类使用覆盖 equalshashcode

    class MyObject {
        final String id;
        final String name;
    
        MyObject(String id, String name) {
            this.id = id;
            this.name = name;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            return Objects.equals(id, ((MyObject) o).id);
        }
    
        @Override
        public int hashCode() {
            return id != null ? id.hashCode() : 0;
        }
    
        @Override
        public String toString() {
            return "MyObject{id='" + id + "', name='" + name + "'}";
        }
    }
    

    在这种情况下,您可以轻松地从列表中删除任何对象

            final ArrayList<MyObject> list = new ArrayList<>();
            list.add(new MyObject("id1", "name1"));
            list.add(new MyObject("id2", "name2"));
            list.add(new MyObject("id3", "name3"));
    
            MyObject removeCandidate = new MyObject("id2", "name2");
    
            list.remove(removeCandidate);
            System.out.println(list);
    

    打印上面的代码

    [MyObject{id='id1', name='name1'}, MyObject{id='id3', name='name3'}]
    

    【讨论】:

      【解决方案3】:

      如果您真的不想遍历列表,可以使用流,但我个人更喜欢 Collection#removeIf,就像 @TagirValeev 建议的那样

      myList = myList.stream()
                     .filter(x -> x.id() != 10)
                     .collect(Collectors.toList());
      

      【讨论】:

        【解决方案4】:

        如果不以某种方式迭代列表,则不可能1ArrayList 中删除元素的实例2ArrayList 是一个底层数组,您需要检查数组中的每个元素以查看它是否符合删除标准。从根本上讲,这需要一个循环......来迭代元素。

        另外请注意,当您从数组中删除单个元素时,所有位置在被删除元素之后的元素都需要移动。平均而言,这将是数组元素的一半。

        现在,您可以通过避免使用显式 for 循环的方式对这些操作进行编码,但无论您如何编码,迭代都将在幕后进行。


        1 - 不完全正确。假设您有一个单独的数据结构(例如)将值映射到ArrayList 中元素的索引,那么您可以在不迭代的情况下删除这些元素。但我看不出您如何有效地管理该数据结构。

        2 - 迭代不仅仅意味着使用Iterator。对于循环,StreamCollections.removeIf 和其他解决方案都需要在底层迭代列表的元素。

        【讨论】:

          【解决方案5】:

          如果没有迭代器,您将无法做到这一点,您应该为此使用 Hashmap。

          public class ObjectStructure{
          private int Id;
          private String name;
          //and any data field you need
          }
          

          生成所有的 setter 和 getter。

          中使用这个类
          Hashmap<Integer, ObjectStructure> data = new HashMap<>();
          

          您可以仅使用整数键添加和删除数据。

          data.remove(10);

          【讨论】:

            猜你喜欢
            • 2018-05-27
            • 2015-09-15
            • 2019-07-02
            • 1970-01-01
            • 1970-01-01
            • 2016-02-19
            • 2018-09-10
            • 1970-01-01
            相关资源
            最近更新 更多