我有ObjectA
& ObjectB
。两者都有一个名为property
ID
的{{1}}。
我有2 (Long)
,List
,其中包含对象类型ListA
和ObjectA
,其中包含对象类型ListB
。
我想用ObjectB
和ListC
中的所有对象填充ListA
但不重复。
我无法使用ListB
方法,因为contains
和ObjectA
是不同的对象,我必须通过属性ObjectB
进行比较。
我知道最好的解决方案是ID
和ObjectA
ObjectB
a extends
,但我暂时无法改变,我只需找到暂时的解决方案使它工作。
我试过这个:
Super class
有什么想法吗?我疯了。
答案 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);
}
}