2012-08-09 11 views
10

Lassen Sie mich sagen, ich habe zwei verschiedene Hashsets wie unten gezeigt, wie kann ich überprüfen, dass zwei Hashset die gleichen Elemente enthalten und diese beiden Hashsets sind gleich, unabhängig von der Reihenfolge der Elemente in der Sammlung, bitte beraten .. !!Möglichkeit zu überprüfen, ob zwei Sammlungen die gleichen Elemente enthalten, unabhängig von der Reihenfolge?

Set set1=new HashSet(); 
      set.add(new Emp("Ram","Trainer",34000)); 
      set.add(new Emp("LalRam","Trainer",34000)); 

und das andere ist ..

Set set2=new HashSet(); 
      set.add(new Emp("LalRam","Trainer",34000)); 
      set.add(new Emp("Ram","Trainer",34000)); 

Der Mitarbeiter pojo ist ...

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; 

     }*/ 
} 
+3

Zuerst definieren "gleich". Entspricht Referenz oder äquivalent? Ist letzteres, ist equals und hashcode für die Emp-Klasse definiert? – MJB

+0

Angenommen, 'Emp' hat richtige Überschreibungen für 'equals()' und 'hashCode()' (was wahrscheinlich ist, da es in einer Hash-Tabelle vorhanden ist), könnten Sie die Anzahl der Mengen vergleichen und dann versuchen, jedes Element hinzuzufügen ein Satz zum anderen. Wenn die Methode 'add()' jemals 'true' zurückgibt, gibt es einen Unterschied. – dlev

+0

Dies ist nicht anders als andere Sammlungen zu vergleichen. Siehe: http://stackoverflow.com/questions/50098/comparting-two-collections-for-equality. Während dies .net ist, sollte die Java-Implementierung ziemlich gleich sein. Ich empfehle Daniel Jennings oder mbillings antwort, da ich mir ziemlich sicher bin, dass die Antwort mit der höchsten Wahl gegen die Nutzungsbedingungen von Microsoft verstößt. –

Antwort

-3

Wenn Sie aus irgendeinem Grund keine eigene Methode implementieren müssen, verwenden Sie einfach h1.equals(h2). Eine mögliche Implementierung wird nachfolgend beschrieben.

  1. Überprüfen Sie, ob Anzahl der Elemente gleich ist. Falls nicht, gebe false zurück.
  2. Clone Set 2 (wenn Sie Set 2 später halten müssen)
  3. Iterieren Sie durch Set 1, überprüfen Sie, ob jedes Element in Clone Set 2 gefunden wird. Wenn gefunden, aus Set 2 entfernen. Wenn nicht gefunden, geben Sie false zurück.
  4. Wenn Sie das Ende der Iterationen erreicht und jedes Element von Menge 1 abgeglichen haben, sind die Mengen gleich (da Sie die Größen der beiden Mengen bereits verglichen haben).

Beispiel:

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 
} 
+0

könnten Sie bitte den Code posten, der das Verständnis klarer macht ..! – user1582269

+2

Dies ist keine gute Antwort, die folgende Antwort sollte das Häkchen bekommen haben. – student

+0

'set1.equals (set2);' wäre besser – MANN

7

Angenommen, Sie definiert equals und hashcode haben, ist hier ein Weg. Nicht sehr effizient für große Mitglieder.

  1. Überprüfen Sie die Anzahl der Elemente in jedem. Wenn sie nicht gleich sind, sind Sie fertig [nicht gleich].
  2. Schleife durch Set1. Überprüfen Sie, ob Set2 jedes Element enthält, wenn Sie nicht fertig sind [ungleich]. sonst, wenn Sie durch den ganzen Satz zu erhalten, sind Sie gleich

UPDATE: Ich nicht über containsAll wusste, was eine Menge Ärger erspart und im Grunde tut, dass Algorithmus

int s1 = set1.size(); 
int s2 = set2.size(); 
if (s1 !=s2) return false; 
return set1.containsAll(set2); 
+0

könnten Sie bitte den Code posten, der das Verständnis klarer macht ..! – user1582269

+0

MJB könnten Sie bitte den kompletten Code aktualisieren, um das Verständnis klar zu machen .. !! – user1582269

+0

cooler Mann vielen Dank .. !! – user1582269

4

Wenn Sie Daten wollen Gleichheit dann korrekt implementieren equals() und hashCode() und dann können Sie Collection.containsAll(...) verwenden. Natürlich müssen Sie sicherstellen, dass Sie dies nur dann aufrufen, wenn beide Ihrer Sammlungen die gleiche Anzahl von Elementen haben, andernfalls können Sie einfach sagen, dass sie nicht gleich sind.

+0

Großartig! Daran hatte ich nicht gedacht. – MJB

+0

Es ist erstaunlich, wie viele Dinge Sie in der Standard-API finden können, wenn Sie nur wissen, wo Sie suchen müssen. :) –

0

Do:

setResult = set2.clone(); 

    if (setResult.retainAll(set1)){ 

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

} 
9

den unten Ausdruck verwenden.

set1.containsAll(set2) && set2.containsAll(set1) 
+4

Das wäre teurer als eine containsAll Präfix von einer Größenprüfung zu tun, würde ich denken. – MJB

82

von AbstractSet.equals(Object) javadoc Zitiert:

Gibt true zurück, wenn das angegebene Objekt auch ein Satz ist, haben die beiden Sätze der gleich groß, und jedes Mitglied der gegebenen Menge in diesem Set enthalten ist . Dies stellt sicher, dass die equals-Methode über verschiedene Implementierungen der Set-Schnittstelle ordnungsgemäß funktioniert.

Es genügt also einfach set1.equals(set2) anzurufen. Es wird true zurückgegeben, wenn und nur wenn das Set die gleichen Elemente enthält (vorausgesetzt, Sie haben equals und hashCode für die Objekte in den Sätzen korrekt definiert).

+0

Nice one! Wusste nicht, dass Gleiches für Sets definiert wurde! – MJB

+4

Dies ist die richtige Antwort und viel einfacher als die angenommene Antwort. +1. – GriffeyDog