2016-08-18 63 views
0

如果您有兩個班級列表,如何比較它們以查看它們是否相同,無論順序如何。Java:無論訂單如何比較兩個班級列表

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

這些列表是一樣的,無論順序如何,但java布爾如何呢? e.g

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

該類是否實現'.getHashCode()'和'.equals()'? (或者你是否真的指'Class'類? – Ryan

+0

假設'Class'是'java.lang.Class',有趣的是它既不實現hashCode()也不實現equals()。 –

回答

1

最好的解決方案將是添加Guava和使用MultiSet

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 
} 

簡單的解決辦法是使用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

在HashMap解決方案中,您可以使用'containsKey()'方法而不是將'get()'與'null'進行比較。 –

+0

@ RayO'Kalahjan您是對的。更新了答案。如果你同意 – xenteros

+1

這個方法,你可以隨意使用upvote,這也可以用一個hashmap完成,在第二個循環中你可以從第一個hashmap中刪除/減少並在最後檢查該hashmap的大小,一些更復雜的代碼內存較少。 – 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"); 
    } 

上面打印

same regardless of order 

我修改原始列表。如果不需要,您可能需要先複印。

Arrays.equals()正在使用Class.equals(),這反過來只是Object.equals()。只要每個類只有一個Class對象,就可以工作。我相信只要你只使用一個類加載器,這就成立了。所以要警告的是這裏有點微妙。