2012-08-09 17 views
10

Diciamo che ho due diversi hashsets come mostrato di seguito come posso verificare che due Hashset contengano gli stessi elementi e questi due hashsets siano uguali, indipendentemente dall'ordine degli elementi in collezione, si prega di avvisare .. !!Modo per verificare se due raccolte contengono gli stessi elementi, indipendentemente dall'ordine?

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

e l'altro è ..

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

Il POJO dipendente è ...

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

prima definire "uguale". Uguale a riferimento o equivoco? Se quest'ultimo è uguale a e hashcode definisce per la classe Emp? – MJB

+0

Supponendo che 'Emp' abbia delle sovrascritture appropriate per' equals() 'e' hashCode() '(che probabilmente fa, data la sua presenza in una tabella hash) puoi confrontare i conteggi sui set, quindi provare ad aggiungere ogni elemento di un set all'altro. Se il metodo 'add()' restituisce sempre 'true', allora c'è una differenza. – dlev

+0

Non è diverso dal confronto di altre raccolte. Vedi: http://stackoverflow.com/questions/50098/comparing-two-collections-for-equality. Mentre questo è .net, l'implementazione di Java dovrebbe essere praticamente la stessa. Raccomando Daniel Jennings o mbillings come risposta sono sicuro che la risposta più votata viola i termini di utilizzo di Microsofts. –

risposta

-3

A meno che non sia necessario implementare il proprio metodo per qualche motivo, è sufficiente utilizzare h1.equals(h2). Una possibile implementazione è descritta di seguito.

  1. Verificare se il numero di elementi è uguale. In caso contrario, restituire false.
  2. Clone set 2 (se è necessario mantenere il set 2 dopo)
  3. Iterare attraverso il set 1, controllare se ciascun elemento è stato trovato nel set di cloni 2. Se trovato, rimuovere dal set 2. Se non trovato, restituire false.
  4. Se raggiungi la fine delle iterazioni e hai abbinato ogni elemento del set 1, i set sono uguali (poiché hai già confrontato le dimensioni dei 2 set).

Esempio:

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

potresti per favore pubblicare il codice che renderà le intese più chiare ...! – user1582269

+2

Questa non è una buona risposta, la risposta qui sotto dovrebbe avere il segno di spunta. – student

+0

'set1.equals (set2);' sarebbe meglio – MANN

7

Supponendo che hai eguali definiti e codice hash, ecco un modo. Non molto efficiente per i membri di grandi dimensioni.

  1. Controllare il numero di elementi in ciascuno. Se non sono uguali, hai finito [non uguale].
  2. Loop through Set1. Controlla se Set2 contiene ogni elemento, altrimenti non hai [non uguale]. altrimenti se si ottiene attraverso l'intera serie, sei uguale

UPDATE: Non sapevo di containsAll, che permette di risparmiare un sacco di problemi e fondamentalmente fa che l'algoritmo

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

potresti per favore postare il codice che renderà le intese più chiare ..! – user1582269

+0

MJB, per favore, puoi aggiornare il codice completo per rendere chiaro lo svantaggio .. !! – user1582269

+0

uomo fantastico grazie mille .. !! – user1582269

4

Se si desidera che i dati l'uguaglianza quindi implementa correttamente equals() e hashCode() e quindi è possibile utilizzare Collection.containsAll(...). Ovviamente, devi assicurarti di chiamarlo solo quando entrambe le tue raccolte hanno lo stesso numero di elementi altrimenti puoi semplicemente dire che non sono uguali.

+0

Fantastico! non l'avevo ricordato. – MJB

+0

È incredibile quante cose puoi trovare nell'API standard se sai solo dove cercare. :) –

0

Do:

setResult = set2.clone(); 

    if (setResult.retainAll(set1)){ 

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

} 
9

usare l'espressione di seguito.

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

Sarebbe più costoso di fare uno contiene tutto il prefisso da un controllo di dimensione, penserei. – MJB

82

Citando AbstractSet.equals(Object) javadoc:

Restituisce vero se l'oggetto specificato è anche un insieme, i due insiemi hanno la stessa dimensione , e ogni membro del set indicato è contenuto in questa serie . Ciò garantisce che il metodo equals funzioni correttamente tra diverse implementazioni dell'interfaccia Set.

Quindi è sufficiente chiamare semplicemente set1.equals(set2). Restituirà true se e solo se il set contiene gli stessi elementi (supponendo che sia stato definito correttamente equals e sugli oggetti nei set).

+0

Bello! Non sapevo che era uguale per gli insiemi! – MJB

+4

Questa è la risposta corretta e molto più semplice della risposta accettata. +1. – GriffeyDog

Problemi correlati