2009-09-17 7 views
4

필드 중 하나의 속성에 따라 정렬해야하는 개체 목록이 있습니다. SortedMap과 Comparators가이 작업을 수행하는 가장 좋은 방법이라고 들었습니다.자바 : SortedMap, TreeMap, Comparable? 사용하는 방법?

  1. 내가 정렬 할 클래스와 Comparable을 구현합니까, 아니면 새 클래스를 만드나요?
  2. 어떻게 SortedMap을 인스턴스화하고 Comparator를 전달합니까?
  3. 분류 작업은 어떻게 이루어 집니까? 새로운 객체가 삽입 될 때 자동으로 모든 것을 정렬합니까?

편집 :

private TreeMap<Ktr> collection = new TreeMap<Ktr>(); 

(KTR은 Comparator<Ktr>를 구현) : 이 코드는 나에게 오류를주고있다. Eclipse는 TreeMap<K, V>과 같은 것을 기대하고 있으므로, 내가 제공하는 매개 변수의 수가 올바르지 않습니다. 당신이 대신 Comparator를 만들 수 있으며이 SortedMap에 전달하지만

+1

TreeSet가 필요합니다. TreeMap이 필요하지 않습니다. – jprete

답변

7
  1. 더 단순한 방법은 기존의 객체와 Comparable을 구현하는 것입니다.
    ComparableComparator은 두 가지 다른 점에 유의하십시오. Comparable을 구현하는 클래스는 다른 객체와 this을 비교하는 반면 Comparator을 구현하는 클래스는 다른 객체를 비교합니다.
  2. Comparable을 구현하면 생성자에 특별한 내용을 전달할 필요가 없습니다. new TreeMap<MyObject>()으로 전화하십시오. (편집 :Maps은 제외하고 두 개의 일반 매개 변수가 필요합니다.)
    대신 Comparator을 구현하는 다른 클래스를 생성하는 경우 해당 클래스의 인스턴스를 생성자에 전달하십시오.
  3. 예, TreeMap Javadocs에 따라.

편집 :에 재 읽고 질문을,이 중 어느 것도 의미가 없습니다. 목록이있는 경우 Comparable을 구현 한 다음 Collections.sort을 호출하면됩니다. 지도가 필요하지 않습니다.

약간의 코드 :

public class MyObject implements Comparable<MyObject> { 
    // ... your existing code here ... 
    @Override 
    public int compareTo(MyObject other) { 
     // do smart things here 
    } 
} 

// Elsewhere: 
List<MyObject> list = ...; 
Collections.sort(list); 

SortedMap와 마찬가지로, 당신은 대신 Comparator<MyObject>을 만들 수 있고 Collections.sort(List, Comparator)에 전달합니다.

+0

무슨 뜻인지 알 수 있습니까? 필자는 클래스가 정렬되는 대신 목록과 함께 Comparable을 구현할 것인가? –

0

내 대답은 사용자가 TreeMap 구현을 SortedMap으로 가정하고 있다고 가정합니다.

1) TreeMap을 사용하는 경우 선택할 수 있습니다. 클래스에 직접 Comparable을 구현하거나 별도의 Comparator을 생성자에 전달할 수 있습니다.

2.) 예 :

Comparator<A> cmp = new MyComparator(); 
Map<A,B> map = new TreeMap<A,B>(myComparator); 

3. 예. 맞습니다. 내부적으로는 TreeMap은 빨강 - 검정 트리를 사용하여 요소를 삽입 할 때 순서대로 저장합니다. 삽입 (또는 검색)을 수행하는 시간 비용은 O (로그 N)입니다.

0

당신은 Comparator<ClassYouWantToSort>을 만듭니다. 그런 다음 비교기는 정렬 할 필드를 비교합니다.

TreeMap을 만들 때 TreeMap<ClassYouWantToSort>을 만들고 Comparator을 인수로 전달합니다. 그런 다음 ClassYouWantToSort 유형의 객체를 삽입 할 때 TreeMapComparator을 사용하여 올바르게 정렬합니다.

편집 : Adamski가 말한 것처럼 ClassYouWantToSort 그 자체를 Comparable으로 만들 수도 있습니다. 이점은 처리 할 클래스가 적고 코드가 더 간단하며 ClassYouWantToSort이 편리한 기본 순서를 얻는 것입니다. 단점은 ClassYouWantToSort에는 명백한 순서가 하나도 없을 수 있으므로 다른 상황에서는 Comparables을 구현해야합니다. ClassYouWantToSort을 변경하지 못할 수도 있습니다.

EDIT2 : 컬렉션에 던져 넣는 오브젝트가 많으며 Map이 아닌 경우 (즉 오브젝트 세트에서 다른 오브젝트 세트로의 매핑이 아닌 경우) TreeSet이 아니라 TreeMap.

2

상황에 따라 다릅니다. 객체 A가 객체 B보다 먼저 정렬되어야한다고 가정 해 봅시다. 일반적으로 A보다 B를 고려하는 것이 일반적이라면 Comparable을 구현하는 것이 합리적입니다. 주문을 컨텍스트에서 사용하는 것이 의미가있는 경우에는 Comparator를 만들어야합니다.

new TreeMap(new MyComparator()); 

아니면 MyComparator 클래스를 만들지 않고

2.

:

new TreeMap(new Comparator<MyClass>() { 
    int compare(MyClass o1, MyClass o2) { ... } 
}); 

3. 예.

1

당신은 목록을 가지고 있고 당신은 내가 당신이 소트 세트를 가정지도에 하나 개의 인수가 있기 때문에 오류가 발생하기 때문에 :

SortedSet<Ktr> set = new TreeSet<Ktr>(comparator); 

이 정렬 된 세트, 즉 유지됩니다 요소를 반환합니다 반복자 그들의 정렬 순서대로. 또한 사용하고자하는 SortedSet에만 해당하는 메소드가 있습니다. 거꾸로 가고 싶다면 NavigableSet을 사용할 수 있습니다.