2012-04-25 72 views
2

我想使用比較器接口對TreeMap進行排序(使用Double作爲值和整數值作爲鍵),但它不起作用。在Java中排序映射不工作

// Create a tree map 
     TreeMap tm = new TreeMap(); 
     // Put elements to the map 
     tm.put(1, new Double(3434.34)); 
     tm.put(0, new Double(123.22)); 
     tm.put(4, new Double(1378.00)); 
     tm.put(2, new Double(99.22)); 
     tm.put(3, new Double(-19.08)); 
     List<Map.Entry> valueList = new ArrayList(tm.entrySet()); 

     // Collections.sort(valueList, new Sort()); 

     Collections.sort(valueList, new Sort()); 

     HashMap sortedMap = new HashMap(); 

     // Get an iterator 
     Iterator<Map.Entry> i = valueList.iterator(); 

     // Display elements 
     while (i.hasNext()) { 
      Map.Entry object = i.next(); 
      sortedMap.put(object.getKey(), object.getValue()); 
     } 
     List sortedList = new ArrayList(sortedMap.entrySet()); 
     Iterator<Map.Entry> iterator = sortedList.iterator(); 
     while (iterator.hasNext()) { 
      Map.Entry entry = iterator.next(); 
      System.out.println("Value " + entry.getValue() + "\n"); 
     } 

以下是我比較級

public class Sort implements Comparator<Map.Entry> { 

    @Override 
    public int compare(Map.Entry o1, Map.Entry o2) { 
     // TODO Auto-generated method stub 
     double valueOne = (Double) o1.getValue(); 
     double valueTwo = (Double) o2.getValue(); 

     int returnValue = 
      valueOne > valueTwo ? -1 : (valueOne == valueTwo ? 0 : 1); 

     return (valueOne > valueTwo ? -1 : (valueOne == valueTwo ? 0 : 1)); 
    } 

} 

但我得到下面的輸出

Value 123.22 

Value 3434.34 

Value 99.22 

Value -19.08 

Value 1378.0 

Edited Part 

public int compare(Map.Entry o1, Map.Entry o2) { 
     // TODO Auto-generated method stub 
     double valueOne = ((Double) o1.getValue()).doubleValue(); 
     double valueTwo = ((Double) o2.getValue()).doubleValue(); 

     int returnValue = 
      valueOne > valueTwo ? -1 : (valueOne == valueTwo ? 0 : 1); 

     return (valueOne > valueTwo ? -1 : (valueOne == valueTwo ? 0 : 1)); 
    } 
+0

你不應該用''==比較符號Double值,而是試圖比較'>'和'<',如果沒有人給你返回一個值,那麼返回0 – 2012-04-25 13:43:10

+0

謝謝你的快速回答。我使用Double類的doubleValue()方法將值更改爲double,但仍未進行排序。請參閱我編輯的部分。 – Dilip 2012-04-25 13:47:15

+0

JDK中沒有'Map'實現,它允許您按值排序。 – 2012-04-25 15:02:21

回答

1

添加到別人已經指出的,試試這個:只有

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.TreeMap; 

public class SortDemo 
{ 
    public class Sort implements Comparator<Map.Entry> 
    { 
    public int compare(Entry o1, Entry o2) 
    { 
     Double valueOne = (Double) o1.getValue(); 
     Double valueTwo = (Double) o2.getValue(); 
     return (int) Math.signum(valueOne.compareTo(valueTwo)); 
    } 
    } 

    public static void main(String[] args) 
    { 
    new SortDemo().foo(); 
    } 

    void foo() 
    { 
    TreeMap tm = new TreeMap(); 
    tm.put(1, new Double(3434.34)); 
    tm.put(0, new Double(123.22)); 
    tm.put(4, new Double(1378.00)); 
    tm.put(2, new Double(99.22)); 
    tm.put(3, new Double(-19.08)); 

    List<Map.Entry> valueList = new ArrayList(tm.entrySet()); 
    Collections.sort(valueList, new Sort()); 

    Iterator<Map.Entry> iterator = valueList.iterator(); 
    while (iterator.hasNext()) 
    { 
     Map.Entry entry = iterator.next(); 
     System.out.println("Value: " + entry.getValue()); 
    } 
    } 
} 
+0

謝謝你給出的工作示例。 – Dilip 2012-04-26 13:28:15

5

HashMap在本質上是無序的。

相反,您可以首先在比較器中創建一個TreeMap

1

當您將它們放入HashMap時,它們將不會保留其順序,因爲HashMap不是有序的映射。

0

使用HashMap進行排序將不起作用,因爲它不是一個列表。您需要查看ArrayList和排序方法。

ArrayList<double> arr = new ArrayList<double>(); 
sort(arr) //sort ascending 
1

Comparator作品你的鑰匙,而不是條目。您需要一個Comparator<Integer>,並將此比較器的實例傳遞給TreeMap構造函數。

TreeMap<Integer,Double> tm = new TreeMap<Integer,Double>(myIntegerComparator); 

在您的例子,你看到的行爲是由於使用Integer的標準comparsion的TreeMap(這工作,因爲IntegerComparable<Integer>)。

(順便說一句,你也應該對仿製藥念起來在你的集合類使用它們,以及任何其他參數化類。)