java - 为自定义对象列表实现 removeAll 的问题

标签 java list removeall

我的代码中有一个场景,我需要比较两个列表并从第一个列表中删除第二个列表中存在的对象。类似于“removeAll”对象如何为 List 工作。由于我的列表是在自定义对象上创建的,因此 removeAll 方法对我不起作用。

我尝试了多种方法来完成这项工作: - 为包含列表的自定义对象实现了 equals() 和 hashCode - 为自定义对象实现了可比接口(interface) - 为自定义对象实现了比较器接口(interface)

我什至尝试过使用 Apache Common 的 CollectionUtils 和 ListUtils 方法(减法、相交、removeAll)。似乎都不起作用。

我知道我可能需要编写一些自定义删除代码。但不确定如何去做。任何帮助我朝着正确方向前进的指示都将不胜感激。

谢谢, 周杰伦

最佳答案

Java 集合已经可以满足您的需求。调用Collection.removeAll(Collection)它将使用 equals() 方法从传入的集合中删除所有项目以测试是否相等。

List<String> list1 = new ArrayList<String>();
Collections.addAll(list1, "one", "two", "three", "four");
List<String> list2 = new ArrayList<String>();
Collections.addAll(list2, "three", "four", "five");
list1.removeAll(list2); // now contains "one", "two"

要使此工作正常,您存储的对象只需要正确实现 equals/hashCode 契约,即:给定任意两个对象 ab:

a.equals(b) == b.equals(a)

和:

a.hashCode() == b.hashCode() if a.equals(b)

不正确定义的 equals 和 hashCode 方法会产生未定义的行为,并且是与集合相关的问题的常见原因。

关于java - 为自定义对象列表实现 removeAll 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2617369/

相关文章:

java - 在 java 中使用 TreeSet 的替代方法?

java - 将 Java 项目中的库/依赖项列入黑名单

java - INT64和DECIMAL(18,6)在Parquet文件格式中意味着什么?

java - 如何以编程方式更改分频器偏差

python 从两个单独的列表中计数对,列表中没有唯一值(我认为集合不起作用)

list - 数学 : Idiomatic way to replace values in a list that match a condition?

javascript - 我想从 200 页中删除以下脚本

java - 动态更改 ThreadPoolExecutor 的 corePoolSize

python - 从列表中删除点对象 : ValueError: list. remove(x): x not in list

security - 通过 SSH 查找并删除?