Java通过公共属性比较不同的对象
我有Java通过公共属性比较不同的对象,java,list,properties,compare,contains,Java,List,Properties,Compare,Contains,我有ObjectA和ObjectB。两者都有一个名为ID(Long)的属性。 我有两个List,ListA包含对象类型ObjectA和ListB包含对象类型ObjectB 我想用ListA和ListB中的所有对象填充ListC,但不要重复 我无法使用contains方法,因为ObjectA和ObjectB是不同的对象,我必须通过属性ID进行比较 我知道最好的解决方案是ObjectA和ObjectB扩展a超级类,但我现在无法改变这一点,我只需要找到一个临时解决方案来实现它 我试过这个: listC
ObjectA
和ObjectB
。两者都有一个名为ID
(Long)
的属性。
我有两个List
,ListA
包含对象类型ObjectA
和ListB
包含对象类型ObjectB
我想用ListA
和ListB
中的所有对象填充ListC
,但不要重复
我无法使用contains
方法,因为ObjectA
和ObjectB
是不同的对象,我必须通过属性ID
进行比较
我知道最好的解决方案是ObjectA
和ObjectB
扩展
a超级类
,但我现在无法改变这一点,我只需要找到一个临时解决方案来实现它
我试过这个:
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);
}
}
}
listC.addAll(listA);
对于(int j=0;j如果它们都具有相同的属性,则编写一个只有值ID的接口(这就是它们存在的原因),并在类ObjectA和ObjectB中实现它。然后您可以编写自己的比较器(使用接口的类型),或者因为您只需要equals,所以只需重写此方法(那不是干净的)。这应该是最干净的方法。如果它们都有相同的属性,那么编写一个只有值ID的接口(这就是它们存在的原因)(可能带有getter)并在类ObjectA和ObjectB中实现它。然后您可以编写自己的比较器(带有接口类型)或者,因为您只需要equals,所以只需重写此方法(这不是干净的)。这应该是最干净的方法。如果您想要一个“高效”的解决方案,您可以实现一个HashSet
,它保存所有尚未使用的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);
}
}
HashSet id=newhashset();
for(ObjectA objA:listA){
列表。添加(objA);
add(objA.getId());
}
对于(ObjectB objB:listB){
如果(!ids.contains(objB.getId())){
add(objB.getId());
添加列表(objB);
}
}
如果您想要一个“高效”的解决方案,您可以实现一个HashSet
,它保存所有尚未使用的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);
}
}
HashSet id=newhashset();
for(ObjectA objA:listA){
列表。添加(objA);
add(objA.getId());
}
对于(ObjectB objB:listB){
如果(!ids.contains(objB.getId())){
add(objB.getId());
添加列表(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);
当然,如果使用原始类型,您会收到编译器警告,但它应该可以工作。对于一个根本不需要接触类的解决方案,您可以实现一个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);
当然,如果使用原始类型,您将收到编译器警告,但它应该可以工作。objectB.getId()括号在检查equal
时丢失。最后一个问题是属性ID有什么类型?类似于int
?如果ID属性是您自己的类,则需要重写equals()方法。@bmt抱歉,我的错误是复制+粘贴。edited您最好为每一个都添加一个Map
,您可以将一个添加到另一个。虽然避免添加超级接口看起来可能更简单,但实际上这会使您的生活更困难。objectB.getId()检查equal
时缺少括号。最后一个括号也是属性ID的类型是什么?类似于int
?如果ID属性是您自己的类,则需要重写equals()方法。@bmt对不起,我的错误是复制+粘贴。编辑你最好为每一个添加一个Map
,你可以将一个添加到另一个。虽然避免添加超级界面可能看起来更简单,但实际上会使你的生活更困难。非常感谢,你救了我一天!非常感谢,你救了我一天!非常好的解决方案。谢谢!解决方案也很好。谢谢!