2012-04-12 3 views
0

나는 사람의 나이별로 정렬되는 TreeSet을 구현하고 있지만, 사람의 이름이 같으면 사람은 세트에 저장되지 않습니다. equals와 hashcode를 구현하지만이 세트는 동일한 이름을 가진 모든 사람을 저장합니다. 나는 이유를 모른다.Java에서 TreeSet을 구현하는 방법은 무엇입니까?

public class Person implements Comparable<Person>{ 
    private String name; 
    private int age; 

    public Person(String name, int age){ 
     this.name = name; 
     this.age = age; 
    } 

    @Override 
    public int compareTo(Person o) { 
     if(this.getAge()<o.getAge()){ 
      return -1; 
     } 
     return this.getAge() == o.getAge()?0:1; 
    } 

    @Override 
    public boolean equals(Object object){ 
     return name.equals(((Person)object).getName()); 
    } 

    @Override 
    public int hashCode(){ 
     return name.hashCode(); 
    } 

    public String getName() { 
     return name; 
    } 

    public int getAge() { 
     return age; 
    } 

    @Override 
    public String toString() { 
     return "Person [name=" + name + ", age=" + age + "]"; 
    } 

    public static void main(String[] args){ 
     Set<Person> set = new TreeSet<Person>(); 
     set.add(new Person("Jack",30)); 
     set.add(new Person("Jack",20)); 
     System.out.println(set); 
    } 
} 

답변

3

하여 ArrayList를 추천하고 정렬 할 것입니다. 그렇게하면 TreeSet은 a.equals(b)a.compareTo(b) == 0과 같다고 생각할 수 있으며 세트의 모든 이름이 다르기 때문에 나이 순으로 정렬됩니다.

+0

정말 고마워요, 어떻게하는지 압니다. – NOrder

+0

+1 실용적인 답변 :) – powerMicha

2

당신은 그렇게 할 수 없습니다. equals와 compareTo는 "같은 일"을해야합니다. 즉, equals가 true를 돌려 주면 compareTo는 0을 반환하고 그 반대의 경우도 마찬가지입니다.

+0

연령별로 정렬 요소를 사용하는 방법은 있지만 이름으로 같은 요소를 비교하는 방법은 무엇입니까? – NOrder

+0

'TreeSet'을 위해 커스텀 컴퍼 레이터를 사용합니까? –

+0

비교기는 나이로 먼저 비교 한 다음 이름으로 비교해야합니다. – powerMicha

0

TreeSet 구현에서 알 수 있듯이 고유 한 요소 만 포함 할 수 있습니다. TreeSet에 이러한 요소를 저장하려면 은 메서드를 사용하여 새 요소를 기존 요소와 한 번 비교합니다.

당신의 코드가 현재 말하고있는 - 사람은 이름과 동일하지만, 나이 만 비교할 난 당신이 equals()´,은 compareTo을 변경하기 바랍니다

() and 해시 코드()`방법에 이름과 나이를 취할 계정.

는 연령하여 Person 개체를 정렬하려면, 난 당신이 compareTo() 함수의 시작에

if(name.equals(o.getName())) { 
    return 0; 
} 

를 추가 할 수있는 사용자 정의 Comparator

+1

당신은 나이별로 정렬하고 이름으로 비교할 수 없다는 것을 의미합니까? – NOrder

+0

사용자 지정 비교기로 정렬 –

+0

감사합니다. – NOrder

0

Set (여기서 TreeSet 상속의)의 정의에 따르면 http://docs.oracle.com/javase/6/docs/api/java/util/Set.html :

세트가 더 E1 요소의 쌍을 포함하지 E2되도록 e1.equals (E2)

하지만 TreeSet도 입력해야합니다 (http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html) :

주문 ma 이 Personname에 의해 처음 equals()를하는 경우 올바르게 설정 인터페이스

그래서를 구현하는 경우 equals와 일관성이 있어야합니다 (명시 적 비교가 제공되는지 여부) 세트로 intained, 당신의 compareTo() 방법을 확인해야합니다, 그렇지 않은 경우 age을 확인하십시오.

관련 문제