我有 2 个哈希集,都包含 x 数量的“名称”(对象)。 我想要做的是查明我的“Names”是在Names1中还是在Names2中?
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)) {'
从未发生过。但我希望得到的输出是 Jon 和 Helen。因为它们不在Names2中。
最佳答案
假设您在 Name
类中重写了 equals
和 hashCode
方法,则可以使用 Set
的 retainAll
方法 (javadoc here ) 来查找公共(public)元素。例如
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
。
关于java - 比较2套Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42189795/