如果您有兩個班級列表,如何比較它們以查看它們是否相同,無論順序如何。Java:無論訂單如何比較兩個班級列表
Class[] list1[class1, class1, class2]
Class[] list2[class2, class1, class1]
這些列表是一樣的,無論順序如何,但java布爾如何呢? e.g
if(list1.sort == list2.sort){}
如果您有兩個班級列表,如何比較它們以查看它們是否相同,無論順序如何。Java:無論訂單如何比較兩個班級列表
Class[] list1[class1, class1, class2]
Class[] list2[class2, class1, class1]
這些列表是一樣的,無論順序如何,但java布爾如何呢? e.g
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()
,這反過來只是Object.equals()
。只要每個類只有一個Class對象,就可以工作。我相信只要你只使用一個類加載器,這就成立了。所以要警告的是這裏有點微妙。
該類是否實現'.getHashCode()'和'.equals()'? (或者你是否真的指'Class'類? – Ryan
假設'Class'是'java.lang.Class',有趣的是它既不實現hashCode()也不實現equals()。 –