使用聚合操作将对象集合复制到另一个集合而不重复
Copying a collection of objects to another collection without duplicates using aggregate operations
我有 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);
当我 运行 代码时,所有项目都被复制到集合中,如输出所示。
另一个只使用字符串的测试工作正常:
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);
有什么方法可以将列表复制到集合中而不重复?是否有针对此的任何聚合操作,或者我是否必须编写自定义方法?
只是想我添加一个答案来展示我最终是如何做到的(当然使用 Adam 的建议)
我将 equals
和 hashCode
方法的实现添加到我的项目 class:
@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;
}
我有 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);
当我 运行 代码时,所有项目都被复制到集合中,如输出所示。
另一个只使用字符串的测试工作正常:
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);
有什么方法可以将列表复制到集合中而不重复?是否有针对此的任何聚合操作,或者我是否必须编写自定义方法?
只是想我添加一个答案来展示我最终是如何做到的(当然使用 Adam 的建议)
我将 equals
和 hashCode
方法的实现添加到我的项目 class:
@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;
}