2016-08-18 2 views
0

두 클래스 목록을 가지고 있다면 어떻게 비교하여 순서에 관계없이 동일한 지 확인할 수 있습니다.Java : 주문에 관계없이 두 클래스 목록을 비교하십시오.

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

이 목록은 순서에 관계없이 동일하지만 java 부울은 어떻게 될 수 있습니까? 예컨대

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

클래스는'.getHashCode()'와'.equals()'를 구현합니까? (또는 당신은 문자 그대로'클래스'클래스를 의미합니까?) – Ryan

+0

'클래스'가'java.lang.Class'라고 가정하면 재미있게'hashCode()'나'equals()'를 구현하지 않습니다. –

답변

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<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 
} 
+0

HashMap 솔루션에서'get()'과'null'을 비교하는 대신'containsKey()'메서드를 사용할 수 있습니다 –

+0

@ RayO'Kalahjan 맞습니다. 업데이트 된 답변. 당신이 – xenteros

+1

접근 방식에 동의한다면 upvote로 자유롭게 해줄 수 있습니다. 두 번째 루프에서 첫 번째 해시 맵을 제거/축소하고 마지막 해시 맵의 크기를 확인하면 더 복잡한 코드가됩니다. 적은 메모리. – tonakai

0
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 객체가 하나만 있으면이 방법이 효과적입니다. 나는 이것이 오직 하나의 클래스 로더를 사용하는 한 사실을 유지한다고 믿는다. 여기서 약간 미묘한 점을 경고하십시오.

관련 문제