2009-07-13 87 views
5

我使用以下幾行來對LinkedHashMap進行排序,但並非所有的項目都排序,有什麼不對?如何按照其值類的字段對LinkedHashMap進行排序?

LinkedHashMap<String,PatternData> statisticsMap; 
// fill in the map ... 

LinkedHashMap<String,PatternData> sortedStatisticsMap=new LinkedHashMap<String,PatternData>();  // Sort it by patternData's average 

ArrayList<PatternData> statisticsMapValues=new ArrayList<PatternData>(statisticsMap.values()); 
Collections.sort(statisticsMapValues,Collections.reverseOrder());    // Sorting it (in reverse order) 

patternData last_i=null; 
for (PatternData i : statisticsMapValues)          // Now, for each value 
{ 
    if (last_i==i) continue;               // Without dublicates 
    last_i=i; 

    for (String s : statisticsMap.keySet())           // Get all hash keys 
    if (statisticsMap.get(s)==i)             // Which have this value 
    { 
     sortedStatisticsMap.put(s,i); 
    } 
} 


class PatternData implements Comparable<PatternData> 
{ 
    float sum=0,average; 
    int totalCount=0; 
    Vector<String> records=new Vector<String>(); 

    public PatternData() { } 

    public void add(float data) 
    { 
    sum+=data; 
    totalCount++; 
    average=sum/totalCount; 
    } 

    public void add(float data,String record) 
    { 
    add(data); 
    records.add(record); 
    } 

    float getAverage() { return average; } 

    public int compareTo(patternData o) { return (int)(average-o.average); } 
} 
+1

我很難超越編碼約定。 ;) – jsight 2009-07-13 03:57:44

+0

是的,所有的大寫都難以閱讀。 – aberrant80 2009-07-13 04:06:38

+0

固定的變量和方法名稱.. – 2009-07-13 04:33:31

回答

7

當您返回int,則範圍時平均o.average爲-1到1之間始終返回0

一種解決方案是簡單地改變你的compareTo功能:

return Float.compare(average, o.average); 
0

您正在使用整數對浮點數進行排序。整數不是四捨五入的;他們會被截斷。另外,考慮到你實際進行排序的方式,可以考慮使用TreeHashMap。

(並且只是爲了挑選,Java約定對方法和變量名稱使用小寫)

相關問題