使用聚合操作将对象集合复制到另一个集合而不重复

时间:2015-01-05 08:54:54

标签: java collections

我有List个名为items的项目,并使用以下内容将此列表复制到Set

 List<Item> items = new ArrayList<>();

    items.add(new Item("Suremen Body Spray", 1900, 45));
    items.add(new Item("HP wireless mouse", 5500, 5));
    items.add(new Item("UWS USB memory stick", 1900, 8));
    items.add(new Item("MTN modem", 1900, 45));
    items.add(new Item("MTN modem", 1900, 45));

    Collection<Item> noDups = new LinkedHashSet<Item>(items); //Copy items to noDups

    //Print the new collection
    noDups.stream()
       .forEach(System.out::println);

当我运行代码时,所有项目都会被复制到集合中,如输出中所示。

enter image description here

使用Strings的不同测试工作得很好:

List<String> names = new ArrayList<>();

    names.add("Eugene Ciurana");
    names.add("Solid Snake");
    names.add("Optimus Prime");
    names.add("Cristiano Ronaldo");
    names.add("Cristiano Ronaldo");


    Collection<String> itemCollection = new HashSet<String>(names);
     itemCollection.stream()
           .forEach(System.out::println);

enter image description here

我可以使用哪种方法将列表复制到没有重复的集合中?是否有任何聚合操作,或者我是否必须编写自定义方法?

2 个答案:

答案 0 :(得分:5)

您需要在Item课程中实施equalshashCode方法。

答案 1 :(得分:1)

只是想我添加一个答案来说明我最终是如何做到的(当然使用Adam的建议)

我将equalshashCode方法的实现添加到我的Item类中:

@Override
public boolean equals(Object obj) {
    if(!(obj instanceof Item)) {
        return false;
    }
    if(obj == this) {
        return true;
    }

    Item other = (Item)obj;
    if(this.getName().equals(other.getName())
           && this.getPrice() == other.getPrice() 
           && this.getCountryOfProduction().equals(other.countryOfProduction)) {
        return true;
    } else {
        return false;
    }

}

public int hashCode() {
    int hash = 3;

    hash = 7 * hash + this.getName().hashCode();
    hash = 7 * hash + this.getCountryOfProduction().hashCode();
    hash = 7 * hash + Double.valueOf(this.getPrice()).hashCode();
    return hash;

}