문제

필드 중 하나의 속성에 따라 정렬 해야하는 객체 목록이 있습니다. SortedMap과 비교기 가이 작업을 수행하는 가장 좋은 방법이라고 들었습니다.

  1. 정렬중인 클래스와 비슷한 구현을 구현합니까, 아니면 새 클래스를 만들나요?
  2. SortedMap을 인스턴스화하고 비교기에서 어떻게 통과합니까?
  3. 분류는 어떻게 작동합니까? 새 개체가 삽입되면 모든 것을 자동으로 정렬합니까?

편집하다:이 코드는 나에게 오류를 제공합니다.

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

(ktr 구현 Comparator<Ktr>). Eclipse는 같은 것을 기대하고 있다고 말합니다 TreeMap<K, V>, 공급하는 매개 변수 수가 잘못되었습니다.

도움이 되었습니까?

해결책

  1. 더 간단한 방법은 구현하는 것입니다 Comparable 대신 기존 객체와 함께 Comparator 그리고 그것을 전달합니다 SortedMap.
    주목하십시오 Comparable 그리고 Comparator 두 가지 다른 것입니다. 클래스 구현 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, 대신 a를 만들 수 있습니다 Comparator<MyObject> 그리고 그것을 전달하십시오 Collections.sort(List, Comparator).

다른 팁

1.

그것은 상황에 달려 있습니다. 객체 A가 세트의 객체 B 앞에 정렬해야한다고 가정 해 봅시다. 일반적으로 B 미만을 고려하는 것이 합리적이라면 비슷한 구현이 의미가 있습니다. 순서가 세트를 사용하는 컨텍스트에서만 의미가 있다면 비교기를 만들어야 할 것입니다.

2.

new TreeMap(new MyComparator());

또는 MyComparator 클래스를 만들지 않고 :

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

3. 예.

맵에 하나의 인수가 있기 때문에 목록이 있고 오류가 발생하기 때문에 정렬 된 세트를 원한다고 생각합니다.

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

이렇게하면 세트를 정렬 할 수 있습니다. 즉, 반복자는 정렬 순서로 요소를 반환합니다. 특정 방법도 있습니다 SINTEDSET 사용하고 싶을 수도 있습니다. 뒤로 가고 싶다면 사용할 수 있습니다. 항비색.

내 대답은 당신이 사용하고 있다고 가정합니다 TreeMap 구현 SortedMap.

1.) 사용하는 경우 TreeMap, 당신은 선택의 여지가 있습니다. 중 하나를 구현할 수 있습니다 Comparable 수업에 직접 또는 별도를 통과하십시오 Comparator 생성자에게.

2.) 예 :

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

3. 예, 맞습니다. 내부적 트리 맵 붉은 검은 나무를 사용하여 요소가 삽입 될 때 순서대로 저장합니다. 삽입 (또는 검색)을 수행하는 시간 비용은 O (log n)입니다.

당신은 a Comparator<ClassYouWantToSort>. 그런 다음 비교기는 정렬하려는 필드를 비교합니다.

당신이 만들 때 TreeMap, 당신은 a를 만듭니다 TreeMap<ClassYouWantToSort>, 그리고 당신은 Comparator 논쟁으로. 그런 다음 유형의 객체를 삽입 할 때 ClassYouWantToSort,, TreeMap 당신의 사용 Comparator 제대로 정렬합니다.

편집 : Adamski가 언급 한 것처럼 ClassYouWantToSort 그 자체 Comparable. 장점은 다루기 위해 클래스가 적고 코드가 더 간단하며 ClassYouWantToSort 편리한 기본 주문을받습니다. 단점은 그 것입니다 ClassYouWantToSort 단일 명백한 주문이 없을 수 있으므로 구현해야합니다. Comparables 어쨌든 다른 상황에 대해. 또한 변경하지 않을 수도 있습니다 ClassYouWantToSort.

edit2 : 컬렉션에 던지는 물건 만 가지고 있다면 Map (즉, 한 객체 세트에서 다른 객체 세트로 매핑하는 것이 아닙니다) 그러면 당신은 TreeSet, TreeMap.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top