我有2个哈希集,都包含x数量的“名称”(对象)。我想做的是找出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)) {'
从来没有发生。但是我希望得到的输出是乔恩和海伦。由于它们不在Names2中。
最佳答案
假设您在equals
类中重写了hashCode
和Name
方法,则可以使用retainAll
的Set
方法(javadoc here)来查找常见元素。例如。
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/