2015-02-02 2 views
2

Java에서 TreeSet은 요소를 오름차순으로 자동 정렬하므로 순서가 보장됩니다.TreeSet을 사용하여 Comparator를 제공하지 않고 정렬합니다.

예를 들어 배열이 무작위로 Date 인 경우이를 TreeSet에 복사하면 정렬 방식으로 TreeSet에 추가됩니다.

단순한 Date 개체 대신, 다음 형식으로 ArrayListHashMap<String,Object> 인 것으로 가정합니다.

의 ArrayList에서 첫 번째 값,

{mydate = 32156464 , mystring = "abc", mystring2 = "xyz"} 
해시 맵의 ArrayList를에서

2 값, 내가 정렬 할 경우 지금

{mydate = 64687678 , mystring = "abdc", mystring2 = "xyzzz"} 
해시 맵의 ArrayList를에서

3 값,

{mydate = 11233678 , mystring = "abxdc", mystring2 = "xyzppzz"} 

키를 기반으로 hashmap 의이 arraylist, 난에서 새로운 비교기를 만들 수있어 그것은 잘 정렬 된 순서에 TreeSet 내부 ArrayList에 저장됩니다

public static Set<HashMap<String, Object>> mySet = new TreeSet<>(new Comparator<HashMap<String, Object>>() { 
     @Override 
     public int compare(HashMap<String, Object> o1, HashMap<String, Object> o2) { 
      return ((Date) o2.get(mydate)).compareTo((mydate) o1.get(DATE)); 
     } 
    }); 

이 같은 53,523,인스턴스. 하지만 이것을 달성하기 위해 맞춤 Comparator을 사용했습니다. 데이터 정렬을 위해이 상황에서 TreeSet을 사용하는 요령은 사용자 정의 Comparator을 제공하는 경우 무엇입니까?

어떻게 정렬 할 수 있습니다이 TreeSetComparator의 새로운 인스턴스를 사용하지 않고 date 값을 기준으로 HashMapArrayList?

+0

정렬 된 컨테이너의 요점은 항목을 특정 순서로 유지하는 것입니다. Comparator는 순서를 결정하는 항목을 지정하는 수단입니다. – khelwood

답변

4

이 상황에서 TreeSet을 사용하여 데이터를 정렬 할 때 사용자 정의 Comparator를 제공 할 경우 어떤 점이 있습니까?

TreeSet 코드로 정렬되어 있기 때문입니다. 그 코드를 제공 할 필요가 없습니다. 모두 사용자 정의 비교입니다.

TreeSet에서 Comparator의 새 인스턴스를 사용하지 않고 HashMap의 ArrayList를 날짜 값을 기준으로 정렬하려면 어떻게해야합니까?

직접 입력 할 수 없습니다. HashMap의 하위 클래스를 작성하여 Comparable을 자체적으로 구현했지만 저에게는 이상하게 보일 수 있습니다. 예를 들면 다음과 같습니다.

public class SpecialMap extends HashMap<String, Object> 
    implements Comparable<SpecialMap> { 

    private final String key; 

    public SpecialMap(String key) { 
     this.key = key; 
    } 

    public int compareTo(SpecialMap other) { 
     // TODO: Null handling 
     Date thisDate = (Date) this.get(key); 
     Date otherDate = (Date) other.get(key); 
     return thisDate.compareTo(otherDate); 
    } 
} 

그런 다음 ArrayList<SpecialMap>을 입력하고 정렬 할 수 있습니다.

그러나 비교기 에 대해 기본적으로 동일한 코드를 제공해야한다는 점을 감안할 때지도 유형과의 비교를 구속 한 점을 감안할 때 비교기를 사용하는 것이 더 좋을 것 같아요.

+0

당신은 또한'HashMap '를'Comparable'을 구현하는 클래스로 감쌀 수 있습니다.하지만 꽤 이상하다는 데 동의합니다. 'TreeSet'에'Comparator'를 제공하면 훨씬 더 좋을 것입니다. –

1

TreeSetComparator을 입력하지 않으면 해당 요소를 Comparable으로 정렬하여 정렬합니다. 그들이 Comparable이 아닌 경우 ClassCastException이 표시됩니다. TreeSet javadocs 설명 :

TreeMap을 기반으로 한 NavigableSet 구현입니다. 요소는 사용 된 생성자에 따라 집합 생성시 제공된 natural ordering 또는 Comparator을 사용하여 정렬됩니다. 사용자 정의 Comparator를 제공해야하므로

는 그러나 HashMap 클래스는 그래서 TreeSet은 당신이 그들을 정렬하는 방법을 알고, Comparable 없습니다. TreeSet 또는 기타 컬렉션에 있든없이는 HashMap을 분류 할 수 없습니다.

이 경우 TreeSet을 사용하면 이점이 있습니다. add, find 및 remove 작업은 O (log n)입니다. 이것을 위해 ArrayList을 사용한다면 find 연산이 여전히 O (log n) 일지라도 연산을 추가하고 제거하는 것이 O (n)이 될 것입니다.

TreeSet에서의 javadoc :

이 구현은 (추가, 삭제 및 포함) 기본 작업에 대한 보증 끝난 log (n) 시간 비용을 제공합니다.

1

대신 HashMap을 사용하면 mydate, mystring, mystring2가 포함 된 클래스를 만들고 Comparable 인터페이스를 구현할 수 있습니다.

그러나 런타임에 정렬 기준을 제공 할 수 있으므로 비교기를 사용하는 것이 좋습니다.

0

TreeSet에서 비교자를 사용하는 것은 실제 정렬을 수행하는 코드를 작성하지 않는다는 것입니다. 비교 규칙을 기준으로 어느 것이 먼저인지를 결정하는 메소드를 제공하기 만하면됩니다. 비교기를 만들고 싶지 않으면 Comparable 인터페이스를 구현하는 컬렉션 개체를 추가해야합니다. ArrayList를 정렬하려면 Collections.sort()를 사용하십시오.

관련 문제