>Java >java지도 시간 >내 Java 비교기에서 '비교 방법이 일반 계약을 위반합니다' 오류가 발생하는 이유는 무엇입니까?

내 Java 비교기에서 '비교 방법이 일반 계약을 위반합니다' 오류가 발생하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-04 15:15:39911검색

Why Does My Java Comparator Throw a

Java 오류: "비교 방법이 일반 계약을 위반합니다"

컬렉션을 정렬할 때 Java는 비교 방법을 사용하여 객체 순서를 설정합니다. 그러나 이 방법은 객체 A가 B보다 크고 B가 C보다 크면 A가 C보다 커야 한다는 전이성 원칙을 준수해야 합니다. 특정 상황에서는 이 계약을 위반하여 " 비교 방법이 일반 계약을 위반합니다." 오류.

객체를 정렬하기 위한 다음 사용자 지정 비교기를 고려하세요. 특정 기준에 따라. 그러나 논리적 불일치로 인해 다음과 같은 전이성 규칙을 위반합니다.

@Override
public int compareTo(Object o) {
    ...
    if (card1.getRarity() < card2.getRarity()) {
        return 1;
    }
    ...
    if (card1.getSet() > card2.getSet()) {
        return -1;
    }
    ...
}

전이성 문제

위 예에서 카드1.getRarity()가 결정적인 경우 인수이고 카드1.getRarity()가 카드2.getRarity()보다 작으면 비교기는 올바르게 1을 반환합니다. 그러나 Card2.getSet()이 결정 요인이고, Card2.getSet()가 Card1.getSet()보다 작으면 비교기가 -1을 잘못 반환합니다. 이로 인해 비전이적 상황이 발생합니다.

올바른 솔루션

전환성을 보장하려면 비교기는 다음 논리를 준수해야 합니다.

if (card1.getRarity() < card2.getRarity()) {
    return 1;
}
if (card1.getRarity() > card2.getRarity()) {
    return -1;
}
...

요약하자면, "비교 방법이 일반 계약을 위반합니다" 오류를 방지하려면 비교 방법이 전이성 원칙을 준수하는지 확인하세요. 이 규칙은 객체 A가 B보다 크고 B가 C보다 큰 경우 A가 C보다 커야 함을 나타냅니다. 전이성을 보장함으로써 일관되고 올바른 정렬 동작을 보장합니다.

위 내용은 내 Java 비교기에서 '비교 방법이 일반 계약을 위반합니다' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.