2012-03-09 6 views
0

Java 프로그램에서 2D 배열이있는 TreeSet이 있습니다. 그러나 어떤 중복도 필요하지 않기 때문에 TreeSet의 contains() 메서드를 사용하여 Comparator를 구현하는 클래스를 만들어 중복을 추가하는지 확인합니다. 그러나 contains()가 때때로 제대로 작동하지 않는 것 같습니다. 다음은 Comparator입니다.2D 배열로 TreeSet 용 Comparator 만들기 - Java

public class ComparatorMatrix implements Comparator<int[][]> { 

public int compare(int[][] matrix1, int[][] matrix2) { 
    if(Arrays.deepEquals(matrix1, matrix2)) {return 0;} 

    return -1; 
} 

저는 equals() 메소드를 구현하지 않았으며, 어떻게해야하는지 잘 모릅니다. 어떻게해야합니까?

+2

비교기는 항목이 작거나 클 경우 음수 또는 양수 값을 반환해야합니다. 당신은 결코 긍정적 인 가치를 반환하지 않습니다. a a 여야합니다. 당신은 그것을 자기 일관성있게 만들어야합니다. 평등을 위해 0을 반환 할 수는 없습니다. 나머지 부분은 제대로 처리해야합니다. –

+0

일반 세트를 통해 TreeSet을 사용해야하는 이유는 무엇입니까? 그럼 평등/해시 코드를 정의하고 행렬이 다른 행렬보다 "작거나"더 큰지 걱정하지 마십시오 – RedDeckWins

+0

TreeSet은 contains() 연산의 log (n) 복잡성을가집니다. 최대한 빨리해야합니다. –

답변

0

ComparatorMatrix는 Comparator의 정의를 만족하지 않으므로 문제가 발생합니다. Carl Manaster가 말했듯이 compare (a, b)가 -1을 반환하면 제대로 반환해야합니다. compare (b, a)는 1을 반환해야하며 그렇지 않으면 TreeSet 내에서 작동하지 않습니다.

주문에 대한 정의가 없으면 다른 HashSet을 사용해야합니다. 그런 다음 hashCode 및 equals 만 구현하면됩니다. equals는 이미 구현되어 있습니다. 해시 코드를 캐시하는 객체 내에 행렬을 쉽게 래핑 할 수 있으므로 매번 다시 계산할 필요가 없습니다.