- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我预计会低于结果,但实际上没有。我想知道如何显示两个集合之间的差异。 (对象是父子关系)在这种情况下,我可以使用像 removeAll() 这样的标准方法,还是可以推荐另一种方法,如使用 apache-commons。谢谢。
CONSTRAINT
------------------------------
1.Item.class is unmodifiable(eg. I can not add equals method)
2.If id is same between two objects, they are assumed as same things.
------------------------------
EXPECTED
------------------------------
removed object are:
2
same object are:
1
3
add object are:
4
------------------------------
ACTUAL
------------------------------
removed object are:
1
2
3
same object are:
add object are:
1
3
4
------------------------------
package com.javastudy;
import java.util.ArrayList;
import java.util.List;
public class CollectionCompareToObjects {
public static void main(String[] args) {
List<Item> before = new ArrayList<Item>();
List<ItemEx> after = new ArrayList<ItemEx>();
before.add(new Item(1L));
before.add(new Item(2L)); // delete
before.add(new Item(3L));
after.add(new ItemEx(1L));
after.add(new ItemEx(3L));
after.add(new ItemEx(4L)); // added
List<Item> removed = new ArrayList<Item>(before);
removed.removeAll(after);
System.out.println("removed objects are:");
for(Item item : removed){
System.out.println(item.getId());
}
List<Item> same = new ArrayList<Item>(before);
same.retainAll(after);
System.out.println("same objects are:");
for(Item item : same){
System.out.println(item.getId());
}
List<Item> added = new ArrayList<Item>(after);
added.removeAll(before);
System.out.println("add objects are:");
for(Item item : added){
System.out.println(item.getId());
}
}
}
package com.javastudy;
public class Item {
private Long id;
public Item(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
package com.javastudy;
public class ItemEx extends Item {
private String name;
public ItemEx(Long id) {
super(id);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
最佳答案
Java 集合依赖于 equals
和 hashCode
方法(后者被 HashMap
s, HashSet
s 和其他人)。
如果您希望能够使用 Java 集合的数据结构功能(例如 removeAll
、retainAll
等),您需要为对象提供适当的实现equals
和 hashCode
。
如果你不能修改Item
类,你可以用你自己的equals
实现写一个包装类:
public class ItemWrapper {
private final Item item;
public ItemWrapper(Item item) {
this.item = item;
}
public Item getItem() {
return item;
}
@Override
public boolean equals(Object obj) {
return obj instanceof ItemWrapper && item.getId().equals(((ItemWrapper) obj).item.getId());
}
@Override
public int hashCode() {
return item.getId().hashCode();
}
}
为每个原始 Item
创建一个新的 ItemWrapper
,将 ItemWrapper
存储在 Java 集合中,并使用所需的方法( removeAll
/retainAll
)。然后迭代生成的集合并通过调用每个 ItemWrapper
的 getItem()
方法检索 Item
。
您的另一个选择是子类化 ArrayList
,但这似乎是一个更复杂的解决方案。
另一种选择是不使用 Java 集合来实现删除/保留逻辑,而是自己实现它们。
关于java - 如何对两个对象使用集合方法(removeAll() 和 retainAll())。 (对象是父子关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4462626/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SSC
我试图使用方法retainAll来比较Java中的两个整数列表,但是返回的结果不是我所期望的,我似乎没有发现这里的问题。在以下代码中,在 servlet 中: // some data recieve
我有一堆列表 ( List ),我想得到交集。 SomeClass 看起来像这样: public class SomeClass { private String a; private Str
我试图找到三个不同大小的哈希集的交集。通过改变集合相交的顺序,找到交集的速度是否有任何差异。示例程序如下: public class RetainTest { static Set large
我正在尝试使用 java 中的交集。如果我有以下内容,我只想要一个没有任何内容的数组列表,因为交集给我零。 List coll1 = Arrays.asList(["A"]); List coll2
我想测试如何获得两个列表之间的交集,这是我的代码: List list = Arrays.asList(16, 17, 18, 19, 20); List li
我有两组都包含相同的对象类型。我希望能够访问以下内容: 两个集合的交集 集合 1 中包含但不包含在集合 2 中的对象 集合 2 中包含但不包含在集合 1 中的对象 我的问题涉及如何最好地比较两组以获得
java.lang.UnsupportedOperationException: This operation is not supported on Query Results at org
我需要根据其他 Collections 的内容筛选 Collections 。通常,我会使用 Collection.retainAll() 方法。 不幸的是,我正在处理的域对象的相等性相当不稳定,具体
我有两个ArrayList。我想比较它们,以获得共同元素的数量。或者只是包含常见元素的列表。 当我尝试使用 CollectionUtils.retainAll 执行此操作时,它不知道我认为这个方法?
我想找到两个 LinkedHashSet 之间的共同元素,主要是我写了自己的函数,但成本是 o(n^2)。然后我找到了更好的解决方案retainAll() java内置函数。我想知道这个功能的成本是多
HashSet1.retainAll(HashSet2); 在幕后如何工作? 我将具有相同参数的对象添加到两个不同的HashSet,但是当我使用上面的内容时,我似乎没有得到正确的结果。即它没有检测到对
是否有任何方法可以一次性为我完成以下操作: List list1 = new ArrayList(Arrays.asList("A","B","C","D")); List list2 = new A
public static List returnIntersection(List a,List b){ List l1=new ArrayList(a); List l2=new
它是否取决于哪个集合对象正在使用 retainAll?我正在使用字符串列表。 我进行了相当多的搜索,并在此处和网上的其他地方发现了一堆提示,它们应该保持列表的顺序不变,但没有明确的直接答案。如果已经回
我有三个哈希集,其中包含访问过不同国家的不同人员。如果我使用 Mexico.retainAll(Cuba);然后 Mexico.retainAll(Jamaica) 它给了我所有访问过这三个国家的人的
我故意违反了 hashCode 契约,该契约规定,如果我们在类中重写 equals() ,我们也必须重写 hashCode() ,并且我正在做确保没有与哈希相关的数据结构(例如 HashMap、Has
我在获取 Java 上多个列表的交集时遇到了麻烦。我正在做的是:我得到(比方说)3 个整数列表: 列表 1:[2, 2, 2, 2, 5, 5] 列表 2:[2, 2, 103] 列表 3:[2, 4
Map map=request.getParameterMap(); ^ 是不可修改的映射。 Set s1= map.keySet(); Set s2= map2.keySet();/* anothe
我预计会低于结果,但实际上没有。我想知道如何显示两个集合之间的差异。 (对象是父子关系)在这种情况下,我可以使用像 removeAll() 这样的标准方法,还是可以推荐另一种方法,如使用 apache
我是一名优秀的程序员,十分优秀!