II는 Comparable 인터페이스를 구현할 때 클래스의 자연 순서가 "equals와 일치해야"하는 것을 어떻게 이해할 수 없습니다. 프로그램에서 결함을 발견 했으므로 인터페이스 Comparable의 문서에서 확인했습니다. 내 문제는 두 개체가 equals 메서드의 기본에서 별개로 간주되지만 TreeMap 구조는 해당 개체를 동일한 것으로 간주하므로 결과적으로 두 번째 삽입을 허용하지 않는다는 것입니다. 샘플 코드 :Comparable를 사용하여 TreeMap에서 객체를 비교하고 정렬 비교
public class Car implements Comparable<Car> {
int weight;
String name;
public Car(int w, String n) {
weight=w;
name=n;
}
public boolean equals(Object o){
if(o instanceof Car){
Car d = (Car)o;
return ((d.name.equals(name)) && (d.weight==weight));
}
return false;
}
public int hashCode(){
return weight/2 + 17;
}
public String toString(){
return "I am " +name+ " !!!";
}
public int compareTo(Car d){
if(this.weight>d.weight)
return 1;
else if(this.weight<d.weight)
return -1;
else
return 0;
}
/*public int compareTo(Car d){
return this.name.compareTo(d.name);
}*/
}
public static void main(String[] args) {
Car d1 = new Car(100, "a");
Car d2 = new Car(110, "b");
Car d3 = new Car(110, "c");
Car d4 = new Car(100, "a");
Map<Car, Integer> m = new HashMap<Car, Integer>();
m.put(d1, 1);
m.put(d2, 2);
m.put(d3, 3);
m.put(d4, 16);
for(Map.Entry<Car, Integer> me : m.entrySet())
System.out.println(me.getKey().toString() + " " +me.getValue());
TreeMap<Car, Integer> tm = new TreeMap<Car, Integer>(m);
System.out.println("After Sorting: ");
for(Map.Entry<Car, Integer> me : tm.entrySet())
System.out.println(me.getKey().toString() + " " +me.getValue());
}
출력은 :
오브젝트 C가 (어느 정도) 대상 (B)를 대체했다고한다I am a !!! 16
I am c !!! 3
I am b !!! 2
After Sorting:
I am a !!! 16
I am c !!! 2
. 이 예상 내가 언급 원래 방법과 동일하고, 두 번째는 이름을 따라 개체를 비교하는 방법을 동일의 주석 경우, 출력은 다음과 같습니다
I am a !!! 16
I am c !!! 3
I am b !!! 2
After Sorting:
I am a !!! 16
I am b !!! 2
I am c !!! 3
는 왜 이런 식으로 돌아올 않고 나는 위해 무엇을 변경해야 TreeMap에 같은 값의 몇개의 속성을 가지는 다른 오브젝트를 삽입 및 소트하기 위해서
Map (HasMap)은 주어진 요소를 다른 이름으로 받아들이므로 TreeMap도 처리해야한다고 생각했습니다. HashMap는 equals 메소드를 고려하여 두 객체를 구별합니다. TreeMap은 요소의 삽입을 허용하거나 거부하지 않기 위해 정렬을 위해서만 compareTo를 사용한다고 생각했습니다. – arjacsoh
@arjacsoh :'TreeMap' 문서를 읽었습니까? 이것에 대해서는 약간 자세히 설명되어 있습니다. –
TreeMap doc로부터 : "그러나 맵은 compareTo (또는 compare) 메소드를 사용하여 모든 키 비교를 수행하므로,이 메소드에 의해 동등한 것으로 간주되는 두 개의 키는 정렬 된 맵의 관점에서 같음". 그래서 그것은 정렬을 위해서가 아니라 "모든 키 비교"를 위해 compareTo를 사용합니다. – arcy