2012-10-06 104 views
1

我有以下代碼進行排序列表,但我需要使它降序排序,改變升序排序降序

List list = new LinkedList(thismap.entrySet()); 
Collections.sort(list, new Comparator() { 
    public int compare(Object o1, Object o2) { 
     return ((Comparable) ((Map.Entry) (o2)).getValue()) 
       .compareTo(((Map.Entry) (o1)).getValue()); 
    } 
}); 

Map output = new LinkedHashMap(); 
for (Iterator it = list.iterator(); it.hasNext();) { 
    Map.Entry entry = (Map.Entry) it.next(); 
    output.put(entry.getKey(), entry.getValue()); 
} 
+3

只需在'compare'中翻轉參數,其餘代碼就可以保持相同。 –

回答

1

這是所有關於修改以下方法的內容:

public int compare(Object o1, Object o2) 
{ 
    return ((Comparable) ((Map.Entry) (o2)).getValue()) 
      .compareTo(((Map.Entry) (o1)).getValue()); 
} 

返回不同的結果比下面的語句的值:

((Comparable)((Map.Entry)(o2)).getValue()).compareTo(((Map.Entry)(o1)).getValue()); 

比方說,在上面的語句被分配給x。那麼你應該返回1,如果x < 0, 返回-1如果x> 0並且返回0如果x == 0,就在compare()方法中。

所以你的方法看起來是這樣的:

public int compare(Object o1, Object o2) 
{ 
    int x = ((Comparable)((Map.Entry)(o2)).getValue()) 
      .compareTo(((Map.Entry)(o1)).getValue()); 
    if(x > 0) 
    return -1; 
    else if (x < 0) 
    return 1; 

    return 0; 
} 
8

一個共同的通用技術是通過簡單地交換參數包裹在一個反向比較的比較器。

class ReverseComparator<T> implements Comparator<T> { 

    private final Comparator target; 

    public ReverseComparator(Comparator<T> target) { 
     super(); 
     this.target = target; 
    } 

    public int compare(T first, T second) { 
     return target.compare(second, first); 
    } 
} 

要使用我們的例子中使用它:

Comparator original = new Comparator() { 
    public int compare(Object o1, Object o2) { 
     return ((Comparable) ((Map.Entry) (o2)).getValue()) 
      .compareTo(((Map.Entry) (o1)).getValue()); 
    } 
}; 

Collections.sort(list, new ReverseComparator(original)); 
+7

爲什麼不使用'java.util.Collections.reverseOrder(Comparator)'而不是滾動自己的'ReverseComparator'類? –

+0

@StephenC感謝您使用-1捕捉邊緣條件。它已從我的回覆中刪除。 –

6

簡單概括來說就是使用java.util.Collections.reverseOrder(Comparator)

Comparator myComparator = new Comparator() { 
    public int compare(Object o1, Object o2) { 
    return ((Comparable) ((Map.Entry) (o2)).getValue()) 
     .compareTo(((Map.Entry) (o1)).getValue()); 
    } 
} 
// ... or whatever. 

Comparator myReverseComparator = Collections.reverseOrder(myComparator); 

可替代地,特定的解決方案將是翻轉的比較方法的參數:

Comparator myReverseComparator = new Comparator() { 
    public int compare(Object o2, Object o1) { // <== NOTE - params reversed!! 
    return ((Comparable) ((Map.Entry) (o2)).getValue()) 
     .compareTo(((Map.Entry) (o1)).getValue()); 
    } 
} 

。注意,通過-1相乘是因爲Integer.MIN_VALUE邊緣殼體的不正確溶液。 Integer.MIN_VALUE * -1是...... Integer.MIN_VALUE