簡體   English   中英

Java:比較兩個類列表,而不考慮順序

[英]Java: Compare two class list regardless of order

如果您有“兩個班級”列表,則如何比較它們以查看它們是否相同,而不管順序如何。

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

這些列表無論順序如何都是相同的,但是java布爾值如何呢? 例如

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

最好的解決方案是添加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
}
    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() ,而Class.equals()則只是Object.equals() 只要每個類只有一個Class對象,這是可行的。 我相信只要您僅使用一個類加載器,這都是正確的。 因此請注意,這里有些微妙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM