繁体   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