比较2套Java集合
问题描述:
我有2个哈希集合,都包含x个“Names”(Object)。什么我想要做的是找出是否在Names1或我“名称” Names2?比较2套Java集合
public static void main (String[] args) {
Set<Name> Names1 = new HashSet<Name>();
Names1.add(new Name("Jon"));
Names1.add(new Name("Mark"));
Names1.add(new Name("Mike"));
Names1.add(new Name("Helen"));
Set<Name> Names2 = new HashSet<Name>();
Names2.add(new Name("Mark"));
Names2.add(new Name("Mike"));
Names2.add(new Name("Sally"));
Set<Name> listCommon = new HashSet<Name>();
for (Name element : Names1) {
if (!Names2.contains(element)) {
listCommon.add(element);
}
}
for (Name element : listCommon) {
System.out.println(element.getNameString());
}
}
public class Name {
String ord;
Name(String ord1){
ord = ord1;
}
public String getNameString(){
return ord;
}
}
所以,当我跑这个代码,我得到任何输出,导致
'if (!Names2.contains(element)) {'
从未发生过。但我想得到的输出将是乔恩和海伦。由于他们不在名称2。
答
假设你有equals
和hashCode
方法Name
类重写,你可以使用的Set
(javadoc的here)retainAll
方法,找出共同的要素。例如。
public static void main(String[] args) throws IOException {
Set<Name> Names1 = new HashSet<Name>();
Names1.add(new Name("Jon"));
Names1.add(new Name("Mark"));
Names1.add(new Name("Mike"));
Names1.add(new Name("Helen"));
Set<Name> Names2 = new HashSet<Name>();
Names2.add(new Name("Mark"));
Names2.add(new Name("Mike"));
Names2.add(new Name("Sally"));
Names1.retainAll(Names2);
for(Name name : Names1){
System.out.println(name.getName());
}
}
这里的例子名称类equals
和hashCode
方法:
class Name{
private String name;
public Name(String name){
this.name = name;
}
@Override
public int hashCode(){
return null != name ? name.hashCode() : 0;
}
@Override
public boolean equals(Object o){
return o instanceof Name
&& ((Name)o).name != null
&& this.name != null
&& ((Name)o).name.equals(this.name);
}
public String getName() {
return name;
}
}
请注意:retainAll
方法修改set
它被称为上(Names1在我们的例子)。如果您想保留原始设置,则可以复制另一组中的元素,并在该实例上调用retainAll
。
答
您的Set::contains
检查不起作用,因为您无法覆盖Object::equals
。 Object::equals
的默认实现是检查引用相等(==),这意味着名称必须是完全相同的实例才能被视为相等。
正如其他人所说,你要做的正确的事情是在你的Name类中实现hashCode和equals。
如果没有这样做,您将不得不遍历整个集合并测试来执行您自己的手动编码和低效版本的Set::contains
测试。
删除你的!运算符来计算常用名称。 – algojava
您的'Name'类中的'equals'和'hashCode'方法是为了简洁还是真正缺失而被删除? –
你需要从超类中重写'equals'和'hashCode'方法,这将是'Object'类 –