자바에서compareTo와 equals 동기화 유지
요약: equlas()와comparable 인터페이스를 다시 작성하여 서로 다른 판단을 하는 것을 소개합니다.이로써 양자에 대응하는list.indexOf () 및 Collections.binarySearch () 가 얻은 것은 다르다.
Java에서 우리는 자주 Comparable 인터페이스를 사용하여 정렬을 실현하는데 그 중에서compareTo는 이 인터페이스를 실현하는 방법이다.우리는compareTo가 0으로 되돌아오는 것은 두 대상이 같다는 것을 알고 있으며, 되돌아오는 양수는 크고, 되돌아오는 음수는 작다는 것을 의미한다.동시에 우리도 equals도 두 대상이 같은지 아닌지를 판단할 수 있다는 것을 알고 있다. 그러면 그들 사이에 관련 관계가 존재하는가?
public class Student implements Comparable<Student>{
private String id;
private String name;
private int age;
public Student(String id,String name,int age){
this.id = id;
this.name = name;
this.age = age;
}
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(this == obj){
return true;
}
if(obj.getClass() != this.getClass()){
return false;
}
Student student = (Student)obj;
if(!student.getName().equals(getName())){
return false;
}
return true;
}
public int compareTo(Student student) {
return this.age - student.age;
}
/** getter、setter */
}
Student 클래스는Comparable 인터페이스를 실현하고 equals를 실현하는 방법입니다. 그 중에서compareTo는age에 따라 비교하고 equals는name에 따라 비교합니다.
public static void main(String[] args){
List<Student> list = new ArrayList<>();
list.add(new Student("1", "chenssy1", 24));
list.add(new Student("2", "chenssy1", 26));
Collections.sort(list); //
Student student = new Student("2", "chenssy1", 26);
// student list
int index1 = list.indexOf(student);
int index2 = Collections.binarySearch(list, student);
System.out.println("index1 = " + index1);
System.out.println("index2 = " + index2);
}
일반적인 사고방식에 따르면 양자 index는 일치해야 한다. 왜냐하면 그들은 같은 대상을 검색했기 때문이다. 그러나 매우 유감스럽게도 그 운행 결과는 다음과 같다.
index1 = 0
index2 = 1
왜 이렇게 다른 결과가 생겼을까?인덱스 Of와binary Search의 실현 메커니즘이 다르기 때문이다.
indexOf는 equals를 바탕으로 이루어진 것입니다. equals가 TRUE로 돌아오면 같은 요소를 찾았다고 생각합니다.
한편,binarySearch는compareTo 방법을 바탕으로 하고,compareTo가 0으로 돌아왔을 때 이 요소를 찾았다고 생각합니다.
우리가 실현한 Student 클래스에서 우리는compareTo와equals 방법을 덮어썼지만 우리의compareTo,equals의 비교 근거는 다르다. 하나는 age를 바탕으로 하고,하나는 name를 바탕으로 한다.비교적 근거가 다르면 얻은 결과가 달라질 가능성이 높다.
그래서 원인을 알게 되면 우리는 수정할 수 있다. 양자 간의 비교 근거를 일치하게 유지하면 된다.
compareTo와 equals 두 가지 방법에 대해 우리는 다음과 같이 요약할 수 있다. compareTo는 원소가 정렬 중의 위치가 같은지 아닌지를 판단하는 것이다. equals는 원소가 같은지 아닌지를 판단하는 것이다. 정렬 위치를 결정하는 한 결정이 같기 때문에 우리는 정렬 위치가 같을 때 그 equals도 같아야 한다는 것을 확보할 필요가 있다.
디테일:compareTo 방법을 실현하면 equals 방법을 실현할 필요가 있고 두 가지 방법의 동기화를 확보해야 한다
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.