2015-02-03 5 views
2

등의 HashMap <문자열, 정수>와 TreeSet의,종류의 유형 예를 들어

TreeSet<HashMap<String,Integer>> myTree = new TreeSet<HashMap<String,Integer>>(); 

나는 HashMap의에서 정수 값을 기준으로 TreeSet의 정렬합니다. 우리가 이것을 할 수있는 좋은 방법이 있습니까?

+12

사용자 정의를 제공'비교기 <의 HashMap <문자열, 정수 >> ''TreeSet'의 생성자에 대해 호출합니다. 그래도 이것은 이상한 디자인처럼 보입니다. –

+6

** ** 정수 값입니까? 왜 하나의 키와 하나의 값을 저장하기 위해 Map을 사용합니까? String 필드와 Integer 필드가 포함 된 클래스를 만들어야합니다. –

답변

1

당신은

public static Set<HashMap<String, Integer>> myTree = new TreeSet<>(
       new Comparator<HashMap<String, Integer>>() { 
        @Override 
        public int compare(HashMap<String, Integer> o1, 
          HashMap<String, Integer> o2) { 
         return (o2.get(key)).compareTo(o1.get(key)); 
     } 
}); 

그냥 정수의 키 key 교체, 사용자 정의 비교를 설계하고 생성자와 같은 TreeSet에 제공해야합니다. 당신이 다음 다른 방법으로 주위를 정렬 할 경우

,

교체와

o2.get(key)).compareTo(o1.get(key) 

,

o1.get(key)).compareTo(o2.get(key) 
1

"HashMap에서 Integer 값을 기반으로이 트리 집합을 정렬"한 것처럼이 요구 사항은 의미가 없거나 복잡하고 혼동스러운 디자인을 나타냅니다.

실제 값 집합을 기반으로 컬렉션을 주문 하시겠습니까? 아니면 Tuple2와 같은지도를 스탠드 인으로 사용하고 계십니까?

귀하의 의도가 전자라면 확실하게 고객 비교자를 만들 수 있습니다. 그 Comparator의 의미는 대부분의 사람들에게는 명백하지 않을 것이며 삽입/삭제시 O (n^2) -ish 동작을 나타내는 구현으로 끝날 것입니다.

그리고 후자 인 경우 시스템이 다시 혼란 스러울 수 있지만 불변량은 훨씬 저조한 모델이됩니다. 즉, 이라고 가정하면 각 Map에는 정확히 하나의 키 - 값 바인딩이 포함되어 있으며 런타임 검사와 함께이 제약 조건을 확실히 적용하고 javadoc 등에서 문서화 할 수 있지만 Map 유형을 직관적으로 사용하지는 않습니다. 이 경우, JB Nizet이 언급 한 것처럼 String과 Integer 필드로 컨테이너 클래스를 생성하는 것이 훨씬 더 좋을 것입니다. 그리고 Comparator를 사용하거나 클래스를 Comparable을 사용하여이 클래스의 컬렉션을 쉽게 정렬 할 수 있습니다 .