2009-07-13 4 views
5

Io uso le seguenti righe per ordinare una LinkedHashMap, ma non tutti gli elementi sono ordinati, qualcosa di sbagliato?Come ordinare una LinkedHashMap dal campo della sua classe di valore?

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

Sto avendo un momento difficile ottenere oltre la convenzione di codifica. ;) – jsight

+0

Sì, tutte le maiuscole rendono difficile la lettura. – aberrant80

+0

Nome variabile e metodo fisso .. –

risposta

7

Quando ritorni int, la gamma in cui media-o.average è compreso tra -1 e 1 restituisce sempre 0.

Una soluzione è semplicemente cambiare la vostra funzione compareTo a:

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

Sì, sei conciso e al punto, ora funziona come previsto, grazie! – Frank

0

Si stanno ordinando numeri in virgola mobile utilizzando numeri interi. I numeri interi non vengono arrotondati; vengono troncati. Inoltre, dato il modo in cui stai effettivamente facendo l'ordinamento, considera l'utilizzo di una TreeHashMap.

(e solo essere pignoli, convenzione Java utilizza minuscole per i nomi dei metodi e delle variabili)

+0

Una TreeHashMap? Non è un ossimoro? Una mappa viene solitamente implementata come tabella hash (HashMap) o albero rosso-nero (TreeMap), non entrambi. :-) –

+1

TreeMap: P hehe, stupido me – aberrant80

Problemi correlati