Java 通过共同点比较不同的对象 属性

Java compare different Object by common property

我有 ObjectA & ObjectB。两者都有一个名为 ID (Long)property。 我有 2 个 ListListA,其中包含对象类型 ObjectAListB,其中包含对象类型 ObjectB.

我想用 ListAListB 中的所有对象填充 ListC,但不要重复。

我不能使用contains方法,因为ObjectAObjectB是不同的对象,我必须通过属性 ID进行比较。

我知道最好的解决方案是 ObjectAObjectB 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>,它包含所有尚未使用的 IDs。

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);

当然,您会收到有关使用原始类型的编译器警告,但它应该有效。