Java通过common属性比较不同的Object

时间:2016-01-28 09:10:45

标签: java list properties compare contains

我有ObjectA& ObjectB。两者都有一个名为property ID的{​​{1}}。 我有2 (Long)List,其中包含对象类型ListAObjectA,其中包含对象类型ListB

我想用ObjectBListC中的所有对象填充ListA但不重复。

我无法使用ListB方法,因为containsObjectA是不同的对象,我必须通过属性ObjectB进行比较。

我知道最好的解决方案是IDObjectA ObjectB a extends,但我暂时无法改变,我只需找到暂时的解决方案使它工作。

我试过这个:

Super class

有什么想法吗?我疯了。

3 个答案:

答案 0 :(得分:3)

如果它们都具有相同的属性,则编写一个接口(这就是它们存在的原因),它只有值ID(可能带有getter)并在Classes ObjectA和ObjectB中实现它。然后你可以编写自己的Comparator(使用你的接口类型),或者因为你只需要equals,所以只需覆盖这个方法(那个不干净)。这应该是最干净的方式。

答案 1 :(得分:3)

对于您根本不需要触摸课程的解决方案,您可以实施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);

当然,您将获得使用原始类型的编译器警告,但它应该可以工作。

答案 2 :(得分:2)

如果你想要一个有效的&#34;解决方案,您可以实现一个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);
    }
}