13

以下に示すように、2 つの異なるハッシュセットがあるとします。コレクション内の要素の順序に関係なく、2 つのハッシュセットに同じ要素が含まれており、これら 2 つのハッシュセットが等しいことを確認するにはどうすればよいでしょうか。アドバイスしてください..!!

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));

従業員ポジョは…

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;

        }*/
} 
4

8 に答える 8

98

AbstractSet.equals(Object) javadocからの引用:

指定されたオブジェクトもセットであり、2 つのセットのサイズが同じで、指定されたセットのすべてのメンバーがこのセットに含まれている場合、true を返します。これにより、 Set インターフェイスのさまざまな実装で equals メソッドが適切に機能することが保証されます。

したがって、単に を呼び出すだけで十分set1.equals(set2)です。trueセットに同じ要素が含まれている場合にのみ返されます (セット内のオブジェクトを正しく定義していると仮定します) equalshashCode

于 2012-08-09T17:23:24.777 に答える
10

equalsとhashcodeを定義したとすると、これが1つの方法です。大規模なメンバーにはあまり効率的ではありません。

  1. それぞれの要素数を確認してください。それらが等しくない場合、あなたは[等しくない]完了です。
  2. Set1をループします。Set2に各要素が含まれているかどうかを確認し、含まれていない場合は[等しくない]。そうでなければ、あなたがセット全体を通り抜けるなら、あなたは平等です

更新:containsAllについて知りませんでした。これにより、多くの問題が回避され、基本的にそのアルゴリズムが実行されます。

int s1 = set1.size();
int s2 = set2.size();
if (s1 !=s2) return false;
return set1.containsAll(set2);
于 2012-08-09T17:17:14.120 に答える
10

以下の式を使用します。

set1.containsAll(set2) && set2.containsAll(set1)
于 2012-08-09T17:22:49.080 に答える
4

データの同等性が必要な場合は、正しく実装equals()してから、 Collection.containsAll(...)hashCode()を使用できます。もちろん、両方のコレクションに同じ数の要素がある場合にのみこれを呼び出すようにする必要があります。そうでない場合は、それらが等しくないと言うことができます。

于 2012-08-09T17:19:43.287 に答える
0

行う:

  setResult = set2.clone();

  if ( setResult.retainAll( set1 ) ){

   //do something with results, since the collection had differences

}
于 2012-08-09T17:20:01.913 に答える
0

1 - あるコレクションが持っていて別のコレクションが持っていないアイテムを含むコレクションを取得します (「差分」と名付けましょう) -

コレクションの違い = CollectionUtils.subtract(Collection1, Collection2);

2 - サイズ == 0 であることを確認します。

その場合 - 両方のコレクションに同じ要素があります。いいえの場合 - いくつかの違いがあり、「違い」が持つすべての項目を印刷する必要があります。

アイテムの注文に依存するかどうかはわかりません。このようにコレクションを比較しています

于 2018-05-02T08:19:48.533 に答える
-4

何らかの理由で独自のメソッドを実装する必要がない限り、そのまま使用してh1.equals(h2)ください。可能な実装を以下に説明します。

  1. 要素数が同じかどうかを確認します。そうでない場合は、false を返します。
  2. クローン セット 2 (後でセット 2 を保持する必要がある場合)
  3. セット 1 を反復処理し、各要素がクローン セット 2 にあるかどうかを確認します。見つかった場合は、セット 2 から削除します。見つからない場合は、false を返します。
  4. 反復の最後に到達し、セット 1 の各要素が一致した場合、セットは等しくなります (2 つのセットのサイズを既に比較しているため)。

例:

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
}
于 2012-08-09T17:23:59.403 に答える