【问题标题】:Java: Compare two class list regardless of orderJava:比较两个类列表而不考虑顺序
【发布时间】:2016-12-25 06:26:21
【问题描述】:

如果您有两个类列表,您如何比较它们以查看它们是否相同而不考虑顺序。

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

无论顺序如何,这些列表都是相同的,但是java如何布尔呢?例如

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

【问题讨论】:

  • 该类是否实现了.getHashCode().equals()? (或者你的字面意思是Class 类?)
  • 假设Classjava.lang.Class,有趣的是它既没有实现hashCode() 也没有实现equals()

标签: java list class sorting compare


【解决方案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&lt;Class, Integer&gt;

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
}

【讨论】:

  • 在HashMap解决方案中,可以使用containsKey()方法,而不是比较get()null
  • @RayO'Kalahjan 你是对的。更新了答案。如果您同意该方法,请随时投票
  • 这也可以用一个 hashmap 来完成,在第二个循环中,您可以从第一个 hashmap 中删除/减少并在最后检查该 hashmap 的大小,这是一个更复杂的代码,内存更少。
【解决方案2】:
    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()。只要每个类只有一个类对象,就可以了。我相信只要您只使用一个类加载器,这就是正确的。所以请注意,这里有点微妙。

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2010-09-08
    • 2019-09-30
    相关资源
    最近更新 更多