我有两个具有相同对象的列表,其中包含不同的id属性值,但是这些项具有其他相同的属性值(例如name属性)。
我想要的是在一个列表中加入两个列表,而不是具有相同属性的重复项目(期望id
)。
我的对象样本:
A{
id:int
name:string
}
我想实现它的方法:
public List<A> join(List<A> list1, List<A> list2){
return a list with aggregated items of list1 and list2(but not with duplicate items which have same property name value)
}
因为不同的id属性值我不能在Java中使用list.retainAll
方法或其他类似的方法。(事实上,两个具有不同id的项目不等于,但我想拒绝id属性)。
我写的代码是:
public List<Node> unionNodeList(List<Node> list1 , List<Node>list2) {
Set<Node> unionList = new HashSet<Node>();
Set<Node> temp = new HashSet<Node>();
for (Node t : list1) {
temp.add(t);
for (Node s : list2) {
if (!t.getPropertyValues().toString().equals(s.getPropertyValues().toString())) {
continue;
} else {
temp.remove(t);
}
}
unionList.addAll(temp);
temp.removeAll(list1);
}
unionList.addAll(list2);
List<Node> myNodes = new ArrayList<Node>(unionList);
return myNodes;
}
我的问题是我可以使用哪种最佳算法或模式?
答案 0 :(得分:2)
最好的解决方案是覆盖
hashCode()
equals()
当然,你需要实现两个对象平等的意义。即。不仅属性而且还有对象的其他一些属性?
之后你可以简单地使用:
set.retailAll(set1);
答案 1 :(得分:1)
如果您想要一组不包含重复项的对象,则List是错误的集合类型。你应该使用一套。创建一个包含第一个列表中所有对象的新集,然后添加第二个列表中的所有对象。消除重复是自动的。