> Java > java지도 시간 > 내 Java `compareTo` 메소드가 일반 계약을 위반하는 이유는 무엇입니까?

내 Java `compareTo` 메소드가 일반 계약을 위반하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-15 02:13:17
원래의
809명이 탐색했습니다.

Why Does My Java `compareTo` Method Violate the General Contract?

오류: Java의 CompareTo 메소드가 일반 계약을 위반합니다

"비교 메소드가 일반 계약을 위반합니다." 오류가 발생하면 실망스러울 수 있습니다. 광범위한 연구에도 불구하고 많은 개발자가 이 문제를 해결하는 데 어려움을 겪고 있습니다.

이 오류는 Java에서 객체를 비교하는 데 사용되는 CompareTo 메서드가 전이성 요구 사항을 위반할 때 발생합니다. 전이성은 A가 B보다 크고 B가 C보다 크면 A가 C보다 커야 함을 나타냅니다.

제공된 코드 조각에서 CollectionItems에 대한 사용자 정의 비교기가 구현되었지만 전이성 위반.

오류 1:

if (card1.getRarity() < card2.getRarity()) {
  return 1;
}
로그인 후 복사

여기서 카드1.getRarity()가 카드2.getRarity()보다 큰 경우 올바른 반환 값은 1이 아니라 -1이어야 합니다.

오류 2:

if (card1.getId() == card2.getId()) {
  //...
}
return -1;
로그인 후 복사

ID가 동일하지 않은 경우, 올바른 반환 값은 카드1.getId()가 카드2.getId()보다 작으면 -1이어야 하고, 카드1.getId()가 더 크다면 1이어야 합니다.

수정된 비교기:

이러한 오류를 해결하기 위해 다음을 준수하는 수정된 비교기 버전이 있습니다. 이행성:

if (card1.getSet() > card2.getSet()) {
    return 1;
}
if (card1.getSet() < card2.getSet()) {
    return -1;
};
if (card1.getRarity() < card2.getRarity()) {
    return 1;
}
if (card1.getRarity() > card2.getRarity()) {
    return -1;
}
if (card1.getId() > card2.getId()) {
    return 1;
}
if (card1.getId() < card2.getId()) {
    return -1;
}
return cardType - item.getCardType();  //watch out for overflow!
로그인 후 복사

위 내용은 내 Java `compareTo` 메소드가 일반 계약을 위반하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿