TreeMap에서 Value값(객체)으로 정렬하는 방법


안녕하세요. 컬랙션 프레임웍을 공부중에 질문을 올려봅니다.

HashMap을 TreeMap으로 변환하면 key값으로 자동 정렬 됩니다.

HashMap<String, GameScore> map = new HashMap<String, GameScore>();
...
TreeMap<String, GameScore> tMap = new TreeMap<String, GameScore>(map);
System.out.println("==" + tMap.values());
결과:
[강감찬, 65200, 이순신, 57800, 임꺽정, 51890, 장길산, 68000, 홍길동, 72680]

제 질문은, TreeMap에 Value값으로 객체(클래스 인스턴스)의 참조값을 주었을때, 클래스의 속성값(int)으로 정렬하는 방법에 대한 것입니다.

검색해보니 SortedSet을 이용하여 comparator를 오버라이딩하는 방법을 찾았는데, HashMap이나 TreeMap에서도 같은 방법을 사용하는 것이 맞다면 자세한 설명 부탁드립니다. 또는 관련 예제를 올려주시면 더욱 도움이 되겠습니다.

참고로, value에 해당하는 객체는 Comparable 인터페이스를 상속받아 comareTo 메소드를 아래와 같이 오버라이딩 하였습니다.

class GameScore implements Comparable<Object> {
    private String name;
    private int score;
    ....
    @Override
    public int compareTo(Object o) {
        GameScore gs = (GameScore) o;
        return (this.score < gs.score ? -1 :(this.score == gs.score ? 0 : 1));
    }
}

조회수 599


1 답변


class GameScore implements Comparable<GameScore> { 
    // Comparable의 Generic에 자기 자신을 넣어주세요.
    private String name;
    private int score;
    ....
    @Override
    public int compareTo(GameScore gs) {
        // 같으면 0,
        // 현재 객체가 gs 보다 작으면 -1
        // 현재 객체가 gs 보다 크면 1
        // 따라서 맞게 작성한것 같습니다.
        return (this.score < gs.score ? -1 :(this.score == gs.score ? 0 : 1));

        // 잘 모르겠으면, Integer 클래스로 boxing 한 다음에, compareTo 를 써도 됩니다. 
        // Integer ts = score;
        // Integer rs = gs.score;
        // return ts.compareTo(rs);
    }
}

위와 같이 고쳐서 한번 해보세요.

그리고 TreeMap은 Key에 대해서 정렬합니다. Value에 대한 정렬이 필요하면, TreeSet을 쓰거나,

List<GameScore> list = new ArrayList<>(map.values()); // JAVA 8에서는 이렇게 써도 됩니다.
Collections.sort(list); // java.util.Collections

위와 같이 List에 넣고 Collections.sort 함수를 써서 정렬하면됩니다.

  • 2016년 04월 21일에 수정됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.
  • 2016년 04월 21일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

  • 빠른 답변 감사드립니다.    Developer Jung   2016.4.21 23:16     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close