检查两个集合是否包含相同元素的方式,与订单无关?

时间:2012-08-09 17:13:05

标签: java collections hashset

假设我有两个不同的哈希集,如下所示,如何检查两个哈希集包含相同的元素,这两个哈希集是否相等,独立于集合中元素的顺序,请指教.. !!

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;

        }*/
} 

8 个答案:

答案 0 :(得分:88)

引自AbstractSet.equals(Object) javadoc:

  

如果给定对象也是一个集合,则返回true,这两个集合具有   相同的大小,并且给定集合的每个成员都包含在此集合中。   这可以确保equals方法在不同方面正常工作   Set接口的实现。

所以只需拨打set1.equals(set2)即可。当且仅当集合包含相同的元素时(假设您已在集合中的对象上正确定义trueequals),它将返回hashCode

答案 1 :(得分:11)

使用以下表达式。

set1.containsAll(set2) && set2.containsAll(set1)

答案 2 :(得分:8)

假设你已经定义了equals和hashcode,这是一种方法。对大型会员来说效率不高。

  1. 检查每个元素的数量。如果他们不平等,你就完成了[不相等]。
  2. 循环通过Set1。检查Set2是否包含每个元素,如果不是,则完成[不相等]。否则,如果你通过整套,你是平等的
  3. 更新:我不知道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)即可。下面描述了一种可能的实现方式。

  1. 检查元素的数量是否相同。如果没有,请返回false。
  2. 克隆集2(如果您需要保留后设置2)
  3. 遍历第1组,检查是否在克隆集2中找到每个元素。如果找到,则从第2组中删除。如果未找到,则返回false。
  4. 如果到达迭代结束并匹配集合1的每个元素,则集合相等(因为您已经比较了2集的大小)。
  5. 示例:

    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
    }