在两个列表中找到额外对象的最佳方法

时间:2016-10-28 06:41:13

标签: java performance list collections

我有两个自定义列表,例如CompanyList,

public class CompanyList<E> extends Collection<E> implements List<E> {} 

这里我有CompanyList的列表,以便

public class CompanyMakeVO extends BaseVO {

    private static final long serialVersionUID = 1L;

    private String name;

    public CompanyMakeVO() {
        super();
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // overrides equals
    public boolean equals(Object obj) {
        if (obj == null || !(obj.getClass() == this.getClass())) {
            return false;
        }

        CompanyMakeVO make = (CompanyMakeVO) obj;

        // NAME
        String thisName = this.getName();
        String thatName = make.getName();

        if (null == thisName || null == thatName)
            return false;

        return thisName.equals(thatName);
    }

    // hashcode
    public int hashCode() {
        return getName().hashCode();
    }
}

我有两个这样的列表,例如oldList和newList都有一些CompanyMakeVO的对象,每个对象通过name属性表示一个公司名称。 让我们说旧名单上有3个物品,名称为奥迪,宝马和阿斯顿马丁,而新名单有5个物品,名称分别为奥迪,宝马,阿斯顿马丁,贾奎尔和特斯拉。列表不会有任何重复项目,即不会重复comapny名称。我需要找到列表中的唯一元素以及列表名称和元素名称。 找到它的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

对于小数据集,包含少量元素的列表,使用List.removeAll()会很方便 对于大型数据集,例如包含数百万个项目的列表,您可以使用HashMap来获取这些元素 由于List.removeAll()将尝试将第一个列表中的每个项目与第二个列表中的所有元素进行比较,即O(NM)复杂度。对于使用HashMap,它只需要O(N + M),比第一个快。

答案 1 :(得分:0)

您可以使用removeAll中的ArrayList()方法,如下所示:

List<CompanyMakeVO> companyMakeVOListOld = new ArrayList<>();
//add your items to the old list

List<CompanyMakeVO> companyMakeVOListNew = new ArrayList<>();
//add your items to new list

//now removeAll duplicate items from new list by passing the old list
companyMakeVOListNew.removeAll(companyMakeVOListOld);

ArrayList - removeAll方法API:

  

public boolean removeAll(Collection c)

     

从此列表中删除其中包含的所有元素   指定的集合。

https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#removeAll(java.util.Collection)