2016-08-18 3 views
0

Wenn Sie Zwei Klassenliste haben, wie können Sie sie vergleichen, um zu sehen, ob sie unabhängig von der Reihenfolge gleich sind.Java: Vergleichen Sie zwei Klassenlisten unabhängig von der Reihenfolge

Class[] list1[class1, class1, class2] 
Class[] list2[class2, class1, class1] 

Diese Liste sind die gleichen unabhängig von der Reihenfolge, aber wie kann Java Boolean dies? z

if(list1.sort == list2.sort){} 
+2

Implementiert die Klasse '.getHashCode()' und '.equals()'? (Oder meinst du wörtlich die 'Class' Klasse?) – Ryan

+0

Angenommen,' Class' ist 'java.lang.Class', witzigerweise implementiert sie weder' hashCode() 'noch' equals() '. –

Antwort

1

Die beste Lösung wird Guava und MultiSet verwenden hinzuzufügen.

HashMultiset<Class> hms1 = new HashMultiSet<>(); 
HashMultiset<Class> hms1 = new HashMultiSet<>(); 
for (Class c : list1) { 
    hms1.add(c); 
} 
for (Class c : list2) { 
    hms2.add(c); 
} 
if (hms1.equals(hms2) { 
    //lists are the same in your understanding of the same 
} 

Einfachere Lösung würde Map<Class, Integer>

HashMap<Class, Integer> hm1 = new HashMap<>(); 
HashMap<Class, Integer> hm2 = new HashMap<>(); 
for (Class c : list1) { 
    if (!hm1.containsKey(c)) { 
     hm1.put(c, 1); 
    } else { 
     hm1.put(c, hm1.get(c)+1); 
    } 
} 
for (Class c : list2) { 
    if (!hm2.containsKey(c)) { 
     hm2.put(c, 1); 
    } else { 
     hm2.put(c, hm2.get(c)+1); 
    } 
} 
if (hm1.equals(hm2) { 
    //lists are the same in your understanding of the same 
} 
+0

In der HashMap-Lösung können Sie die Methode 'containsKey()' anstelle von 'get()' mit 'null' verwenden. –

+0

@ RayO'Kalahjan Sie haben Recht. Aktualisierte Antwort Fühlen Sie sich frei zu upvote, wenn Sie dem Ansatz zustimmen – xenteros

+1

Dies kann mit einer hashmap auch getan werden, in der zweiten Schleife können Sie entfernen/reduzieren von ersten hashmap und überprüfen Sie die Größe dieser hashmap am Ende, ein bisschen komplizierter Code mit weniger Speicher – tonakai

0
Class<?>[] list1 = new Class[] { String.class, String.class, Integer.class }; 
    Class<?>[] list2 = new Class[] { Integer.class, String.class, String.class }; 

    Comparator<Class<?>> classComparator = new Comparator<Class<?>>() { 

     @Override 
     public int compare(Class<?> o1, Class<?> o2) { 
      return o1.getCanonicalName().compareTo(o2.getCanonicalName()); 
     } 
    }; 

    Arrays.sort(list1, classComparator); 
    Arrays.sort(list2, classComparator); 

    if (Arrays.equals(list1, list2)) { 
     System.out.println("same regardless of order"); 
    } else { 
     System.out.println("NOT same regardless of order"); 
    } 

Die oben druckt

same regardless of order 

Ich Modifizierung der ursprünglichen Listen zu verwenden sein. Vielleicht möchten Sie zuerst Kopien machen, wenn dies nicht gewünscht ist.

Arrays.equals() verwendet Class.equals(), was wiederum nur Object.equals() ist. Solange es nur ein Klassenobjekt für jede Klasse gibt, funktioniert dies. Ich glaube, dass dies gilt, solange Sie nur einen Klassenlader verwenden. Seien Sie also gewarnt, dass es hier ein bisschen subtil ist.

Verwandte Themen