假设我有两个不同的哈希集,如下所示,如何检查两个哈希集包含相同的元素,这两个哈希集是否相等,独立于集合中元素的顺序,请指教.. !!
Set set1=new HashSet();
set.add(new Emp("Ram","Trainer",34000));
set.add(new Emp("LalRam","Trainer",34000));
另一个是..
Set set2=new HashSet();
set.add(new Emp("LalRam","Trainer",34000));
set.add(new Emp("Ram","Trainer",34000));
员工pojo是......
class Emp //implements Comparable
{
String name,job;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
int salary;
public Emp(String n,String j,int sal)
{
name=n;
job=j;
salary=sal;
}
public void display()
{
System.out.println(name+"\t"+job+"\t"+salary);
}
public boolean equals(Object o)
{
Emp p=(Emp)o;
return this.name.equals(p.name)&&this.job.equals(p.job) &&this.salary==p.salary;
}
public int hashCode()
{
return name.hashCode()+job.hashCode()+salary;
}
/* public int compareTo(Object o)
{
Emp e=(Emp)o;
return this.name.compareTo(e.name);
//return this.job.compareTo(e.job);
// return this.salary-e.salary;
}*/
}
答案 0 :(得分:88)
引自AbstractSet.equals(Object) javadoc:
如果给定对象也是一个集合,则返回true,这两个集合具有 相同的大小,并且给定集合的每个成员都包含在此集合中。 这可以确保equals方法在不同方面正常工作 Set接口的实现。
所以只需拨打set1.equals(set2)
即可。当且仅当集合包含相同的元素时(假设您已在集合中的对象上正确定义true
和equals
),它将返回hashCode
。
答案 1 :(得分:11)
使用以下表达式。
set1.containsAll(set2) && set2.containsAll(set1)
答案 2 :(得分:8)
假设你已经定义了equals和hashcode,这是一种方法。对大型会员来说效率不高。
更新:我不知道containsAll,这可以省去很多麻烦,基本上就是算法
int s1 = set1.size();
int s2 = set2.size();
if (s1 !=s2) return false;
return set1.containsAll(set2);
答案 3 :(得分:4)
如果您希望数据相等,请正确实施equals()
和hashCode()
,然后您可以使用Collection.containsAll(...)。当然,你需要确保只有当你的两个集合都有相同数量的元素时才调用它,否则你可以说它们不相等。
答案 4 :(得分:0)
执行:
setResult = set2.clone();
if ( setResult.retainAll( set1 ) ){
//do something with results, since the collection had differences
}
答案 5 :(得分:0)
1 - 获取一个集合(让我们将其命名为“差异”),其中包含一个集合中的项目,另一个集合没有 -
集合差异= CollectionUtils.subtract(Collection1,Collection2);
2 - 检查尺寸== 0;
如果是这样 - 两个集合都有相同的元素; 如果不是 - 存在一些差异,那么你必须打印所有差异'具有
不确定是否取决于商品订单。 我以这种方式比较馆藏
答案 6 :(得分:0)
当您不知道集合的类型时,这是一个冗长但(希望)有效的解决方案:
if let child = self.children.first as? TextViewController {
child.text = text
child.delegate = self
}
else {
print("problem setting the child ",self.children.count)
}
答案 7 :(得分:-4)
除非您出于某种原因需要实施自己的方法,否则只需使用
h1.equals(h2)
即可。下面描述了一种可能的实现方式。
示例:
public boolean isIdenticalHashSet <A> (HashSet h1, HashSet h2) {
if ( h1.size() != h2.size() ) {
return false;
}
HashSet<A> clone = new HashSet<A>(h2); // just use h2 if you don't need to save the original h2
Iterator it = h1.iterator();
while (it.hasNext() ){
A = it.next();
if (clone.contains(A)){ // replace clone with h2 if not concerned with saving data from h2
clone.remove(A);
} else {
return false;
}
}
return true; // will only return true if sets are equal
}