두 클래스 목록을 가지고 있다면 어떻게 비교하여 순서에 관계없이 동일한 지 확인할 수 있습니다.Java : 주문에 관계없이 두 클래스 목록을 비교하십시오.
Class[] list1[class1, class1, class2]
Class[] list2[class2, class1, class1]
이 목록은 순서에 관계없이 동일하지만 java 부울은 어떻게 될 수 있습니까? 예컨대
if(list1.sort == list2.sort){}
두 클래스 목록을 가지고 있다면 어떻게 비교하여 순서에 관계없이 동일한 지 확인할 수 있습니다.Java : 주문에 관계없이 두 클래스 목록을 비교하십시오.
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()
이고, 차례로는 Object.equals()
입니다. 각 Class에 대해 Class 객체가 하나만 있으면이 방법이 효과적입니다. 나는 이것이 오직 하나의 클래스 로더를 사용하는 한 사실을 유지한다고 믿는다. 여기서 약간 미묘한 점을 경고하십시오.
클래스는'.getHashCode()'와'.equals()'를 구현합니까? (또는 당신은 문자 그대로'클래스'클래스를 의미합니까?) – Ryan
'클래스'가'java.lang.Class'라고 가정하면 재미있게'hashCode()'나'equals()'를 구현하지 않습니다. –