Java : SortedMap, Treemap, 비슷한가요? 사용하는 방법?
-
10-07-2019 - |
문제
필드 중 하나의 속성에 따라 정렬 해야하는 객체 목록이 있습니다. SortedMap과 비교기 가이 작업을 수행하는 가장 좋은 방법이라고 들었습니다.
- 정렬중인 클래스와 비슷한 구현을 구현합니까, 아니면 새 클래스를 만들나요?
- SortedMap을 인스턴스화하고 비교기에서 어떻게 통과합니까?
- 분류는 어떻게 작동합니까? 새 개체가 삽입되면 모든 것을 자동으로 정렬합니까?
편집하다:이 코드는 나에게 오류를 제공합니다.
private TreeMap<Ktr> collection = new TreeMap<Ktr>();
(ktr 구현 Comparator<Ktr>
). Eclipse는 같은 것을 기대하고 있다고 말합니다 TreeMap<K, V>
, 공급하는 매개 변수 수가 잘못되었습니다.
해결책
- 더 간단한 방법은 구현하는 것입니다
Comparable
대신 기존 객체와 함께Comparator
그리고 그것을 전달합니다SortedMap
.
주목하십시오Comparable
그리고Comparator
두 가지 다른 것입니다. 클래스 구현Comparable
비교this
클래스가 구현하는 동안 다른 객체에Comparator
두 가지를 비교합니다 다른 사물. - 구현하는 경우
Comparable
, 당신은 특별한 것을 생성자에 전달할 필요가 없습니다. 그냥 전화하십시오new TreeMap<MyObject>()
. (편집하다: 물론Maps
하나가 아닌 두 개의 일반적인 매개 변수가 필요합니다. 바보 나!)
대신 다른 클래스 구현을 만드는 경우Comparator
, 해당 클래스의 인스턴스를 생성자로 전달하십시오. - 그렇습니다
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. 예.
내 대답은 당신이 사용하고 있다고 가정합니다 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
.