Java 通过共同点比较不同的对象 属性
Java compare different Object by common property
我有 ObjectA
& ObjectB
。两者都有一个名为 ID
(Long)
的 property
。
我有 2 个 List
、ListA
,其中包含对象类型 ObjectA
和 ListB
,其中包含对象类型 ObjectB
.
我想用 ListA
和 ListB
中的所有对象填充 ListC
,但不要重复。
我不能使用contains
方法,因为ObjectA
和ObjectB
是不同的对象,我必须通过属性 ID
进行比较。
我知道最好的解决方案是 ObjectA
和 ObjectB
extends
一个 Super class
,但我现在不能改变它,我只需要找到一个临时解决方案以使其工作。
我试过这个:
listC.addAll(listA);
for(int j=0; j<ListA.size(); j++) {
for(int k=0; k<ListB.size(); k++) {
ObjectA objectA = ((ObjectA)listA.get(j));
ObjectB objectB = ((ObjectB)listB.get(k));
if(!objectA.getId().equals(objectB.getId())) {
listC.add(objectB);
}
}
}
有什么想法吗?我快要疯了。
如果它们都具有相同的 属性,请编写一个仅具有值 ID(可能带有 getter)的接口(这就是它们存在的原因)并在您的 类 对象 A 和对象 B。然后你可以编写你自己的比较器(使用你的接口类型)或者因为你只需要等于,只需覆盖这个方法(那不会干净)。这应该是最干净的方法了。
如果您想要一个 "efficient" 解决方案,您可以实施一个 HashSet<Long>
,它包含所有尚未使用的 ID
s。
HashSet<Long> ids = new HashSet<Long>();
for (ObjectA objA: listA) {
list.add(objA);
ids.add(objA.getId());
}
for (ObjectB objB: listB) {
if (!ids.contains(objB.getId())) {
ids.add(objB.getId());
list.add(objB);
}
}
对于根本不需要触摸 类 的解决方案,您可以实施 java.util.Comparator
,例如
public class ObjectComparator implements java.util.Comparator {
@Override
public int compare(Object o1, Object o2) {
long id1 = -1L;
long id2 = -1L;
if(o1 instanceof ObjectA) {
id1 = ((ObjectA)o1).getId();
}
if(o1 instanceof ObjectB) {
id1 = ((ObjectB)o1).getId();
}
if(o2 instanceof ObjectA) {
id2 = ((ObjectA)o2).getId();
}
if(o2 instanceof ObjectB) {
id2 = ((ObjectB)o2).getId();
}
return Long.valueOf(id1).compareTo(Long.valueOf(id2));
}
}
然后您可以简单地使用 java.util.TreeSet
为您删除重复项:
Set distinct = new TreeSet(new ObjectComparator());
distinct.addAll(listA);
distinct.addAll(listB);
当然,您会收到有关使用原始类型的编译器警告,但它应该有效。
我有 ObjectA
& ObjectB
。两者都有一个名为 ID
(Long)
的 property
。
我有 2 个 List
、ListA
,其中包含对象类型 ObjectA
和 ListB
,其中包含对象类型 ObjectB
.
我想用 ListA
和 ListB
中的所有对象填充 ListC
,但不要重复。
我不能使用contains
方法,因为ObjectA
和ObjectB
是不同的对象,我必须通过属性 ID
进行比较。
我知道最好的解决方案是 ObjectA
和 ObjectB
extends
一个 Super class
,但我现在不能改变它,我只需要找到一个临时解决方案以使其工作。
我试过这个:
listC.addAll(listA);
for(int j=0; j<ListA.size(); j++) {
for(int k=0; k<ListB.size(); k++) {
ObjectA objectA = ((ObjectA)listA.get(j));
ObjectB objectB = ((ObjectB)listB.get(k));
if(!objectA.getId().equals(objectB.getId())) {
listC.add(objectB);
}
}
}
有什么想法吗?我快要疯了。
如果它们都具有相同的 属性,请编写一个仅具有值 ID(可能带有 getter)的接口(这就是它们存在的原因)并在您的 类 对象 A 和对象 B。然后你可以编写你自己的比较器(使用你的接口类型)或者因为你只需要等于,只需覆盖这个方法(那不会干净)。这应该是最干净的方法了。
如果您想要一个 "efficient" 解决方案,您可以实施一个 HashSet<Long>
,它包含所有尚未使用的 ID
s。
HashSet<Long> ids = new HashSet<Long>();
for (ObjectA objA: listA) {
list.add(objA);
ids.add(objA.getId());
}
for (ObjectB objB: listB) {
if (!ids.contains(objB.getId())) {
ids.add(objB.getId());
list.add(objB);
}
}
对于根本不需要触摸 类 的解决方案,您可以实施 java.util.Comparator
,例如
public class ObjectComparator implements java.util.Comparator {
@Override
public int compare(Object o1, Object o2) {
long id1 = -1L;
long id2 = -1L;
if(o1 instanceof ObjectA) {
id1 = ((ObjectA)o1).getId();
}
if(o1 instanceof ObjectB) {
id1 = ((ObjectB)o1).getId();
}
if(o2 instanceof ObjectA) {
id2 = ((ObjectA)o2).getId();
}
if(o2 instanceof ObjectB) {
id2 = ((ObjectB)o2).getId();
}
return Long.valueOf(id1).compareTo(Long.valueOf(id2));
}
}
然后您可以简单地使用 java.util.TreeSet
为您删除重复项:
Set distinct = new TreeSet(new ObjectComparator());
distinct.addAll(listA);
distinct.addAll(listB);
当然,您会收到有关使用原始类型的编译器警告,但它应该有效。