我有两个哈希集,都包含x数量的“名称”(对象)。想要做的是找出我的在 Names1 或E 110名称2E 211中是否有“”?
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)) {' 从未发生过。但作为产出,我想得到的是乔恩和海伦。因为他们不在Names2。
发布于 2017-02-12 16:08:25
假设equals和hashCode方法在Name类中覆盖,则可以使用Set的retainAll方法(javadoc 这里 )来查找公共元素。例如。
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方法的示例Name类:
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。
发布于 2017-02-12 16:28:15
您的Set::contains检查将无法工作,因为您未能覆盖Object::equals。Object::equals的默认实现是检查引用相等(==),这意味着名称必须是完全相同的实例,才能被视为相等。
正如其他人所指出的,正确的做法是在您的Name类中实现hashCode和equals。
如果做不到这一点,您将不得不遍历集合并测试obj1.getNameString().equals(obj2.getNameString()),以执行您自己编写的、效率低下的Set::contains测试版本。
https://stackoverflow.com/questions/42189795
复制相似问题