2012-12-12 4 views
-3

가능한 중복 :
TreeMap sort by value
Map that could be iterated in the order of values(날짜) 값을 기준으로 TreeMap을 정렬하는 방법은 무엇입니까?

나는 유형 <String, Date>의 트리 맵을 가지고있다. 날짜순으로 정렬하고 싶습니다 (가장 최근의 것부터). 고유 한 것으로 보장 할 수는 없으므로 키로 사용할 수 없습니다. 이 일을 할 수있는 방법이 있습니까?

+0

@ Nambari, 값이 고유하지 않은 경우 해당 질문에 대한 대답이 작동하지 않습니다. –

+0

@Louis, 값이 고유하지 않은데 왜 작동하지 않아야합니까? – ignis

+0

@ 루이스 와서 만 : 알겠습니다. 사실 나는 당신의 대답을 찾고 있었지만, 나는 똑같은 일을한다고 생각했다. 나는 그것을 제거하고있다. – kosa

답변

5
당신이 직접 할 수없는

, 당신이 할 수있는 일은 새에 컬렉션의 내용을 복사하는 것입니다 그리고 종류는, 예를 들면 :

List<Map.EntrySet<String, Date>> copy = new ArrayList<Map.EntrySet<String, Date>>(treeMap.entrySet()); 
Collections.sort(copy, new CustomComparator()); 

class CustomComparator implements Comparator<Map.Entry<String,Date>> { 
    public int compareTo(Map.Entry<String,Date> e1, Map.Entry<String,Date> e2) { 
    // compare your dates 
    } 
} 

물론이 컬렉션은되지 않습니다 원래 하나와 동기화되었으므로 원본 TreeSet이 수정 될 때마다 다시해야합니다. 당신이 정말로 원하는 경우

+0

오늘 날짜를 기준으로 한 일종의 정렬이 있습니까? 출생일처럼? – Skynet

0

사실 당신은 트리 맵에 중복 키를 가질 수 있습니다 그것은

Map<Date, String> map = new TreeMap<Date, String>(new Comparator<Date>() { 
     @Override 
     public int compare(Date d1, Date d2) { 
      return d1.after(d2) ? 1 : -1; 
     } 
    }); 
    Date d1 = new Date(-100000000000L); 
    Date d2 = new Date(100000000000L); 
    map.put(d2, "s1"); 
    map.put(d1, "s2"); 
    map.put(d1, "s3"); 
    System.out.println(map); 

출력

2 개 항목이 동일한 키를 가지고 있고, 당신이 원하는대로 출력이 날짜로 정렬하는 것으로
{Mon Oct 31 16:13:20 EET 1966=s3, Mon Oct 31 16:13:20 EET 1966=s2, Sat Mar 03 11:46:40 EET 1973=s1} 

+0

정의에 의한'Map'은 하나의 키에 대해 두 개의 값을 가질 수 없습니다. 내가 뭘 놓치고 있니? –

+0

테스트에 사용 된 비교기가 허용합니다. 모두 Comparator와 당신의 욕망에 달려있다. TreeMap은 필요하다면 2가 1보다 작다고 생각하게 만들 수있다. –

+0

아, 당신의 콤퍼레이터는 0을 반환하지 않습니다. –

관련 문제