如何在一个列表中聚合两个列表而不重复项目?

时间:2014-08-06 07:40:06

标签: java

我有两个具有相同对象的列表,其中包含不同的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;
}

我的问题是我可以使用哪种最佳算法或模式?

2 个答案:

答案 0 :(得分:2)

最好的解决方案是覆盖

hashCode() 
equals()
当然,你需要实现两个对象平等的意义。即。不仅属性而且还有对象的其他一些属性?

之后你可以简单地使用:

set.retailAll(set1);

答案 1 :(得分:1)

如果您想要一组不包含重复项的对象,则List是错误的集合类型。你应该使用一套。创建一个包含第一个列表中所有对象的新集,然后添加第二个列表中的所有对象。消除重复是自动的。