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

Jay*_*ay 6 java list removeall

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

我已经尝试了各种方法来完成这项工作: - 为包含列表的自定义对象实现了equals()和hashCode - 为自定义对象实现了Comparable Interface - 为自定义对象实现了Comparator接口

我甚至尝试过使用Apache Common的CollectionUtils和ListUtils方法(减去,交叉,删除所有).似乎没有工作.

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

谢谢,杰伊

cle*_*tus 14

Java Collections已经适合您的场景.调用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"
Run Code Online (Sandbox Code Playgroud)

要使这项工作成为您正在存储的对象,只需要正确实现equals/hashCode合约,即:给定任意两个对象,a并且b:

a.equals(b) == b.equals(a)
Run Code Online (Sandbox Code Playgroud)

和:

a.hashCode() == b.hashCode() if a.equals(b)
Run Code Online (Sandbox Code Playgroud)

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

  • @Roman直到他发布了一些我不相信的代码.很可能它会归结为错误使用API​​或违反equals/hashCode合同等. (8认同)

Rom*_*man 6

覆盖equalshashCode方法足以使方法removeAll在自定义对象上工作.

您可能没有以适当的方式覆盖它们.有些代码会对我们有所帮助.