2009-07-13 10 views
5

Ich benutze die folgenden Zeilen, um eine LinkedHashMap zu sortieren, aber nicht alle Elemente sind sortiert, irgendetwas falsch?Wie wird eine LinkedHashMap nach dem Feld ihrer Wertklasse sortiert?

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

Ich habe eine harte Zeit, die Vergangenheit der Codierung Konvention zu bekommen. ;) – jsight

+0

Ja, alle Caps machen ein schwieriges Lesen. – aberrant80

+0

Variable und Methodennamen behoben .. –

Antwort

7

Wenn Sie int zurückgeben, ist der Bereich, wenn durchschnittlich o.average zwischen -1 und 1 wird immer 0.

Eine Lösung zurückkehren wird einfach Ihre compareTo Funktion ändern:

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

Ja, Sie sind kurz und auf den Punkt, jetzt funktioniert es wie beabsichtigt, danke! – Frank

0

Sie sortieren Fließkommazahlen mit ganzen Zahlen. Ganzzahlen werden nicht gerundet; sie werden abgeschnitten. Angesichts der Art, wie Sie die Sortierung tatsächlich durchführen, sollten Sie stattdessen eine TreeHashMap verwenden.

(und nur nitpick, verwendet Java-Konvention Klein für Methode und Variablen-Namen)

+0

Eine TreeHashMap? Ist das nicht ein Oxymoron? Eine Map wird normalerweise entweder als Hash-Tabelle (HashMap) oder als rot-schwarzer Baum (TreeMap) implementiert, nicht beides. :-) –

+1

TreeMap: P hehe, dumme mich – aberrant80

Verwandte Themen