2009-07-13 11 views
5

Uso las siguientes líneas para ordenar un LinkedHashMap, pero no todos los elementos están ordenados, ¿hay algún problema?¿Cómo ordenar un LinkedHashMap por su campo de clase de valor?

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

Estoy teniendo dificultades para conseguir más allá de la convención de codificación. ;) – jsight

+0

Sí, todas las mayúsculas hacen una lectura difícil. – aberrant80

+0

Nombres de variables y métodos corregidos .. –

Respuesta

7

Cuando regresa int, cuando la gama media-o.average es entre -1 y 1 siempre devolverá 0.

Una solución es simplemente cambiar su función a compareTo:

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

Sí, es conciso y al grano, ahora funciona como estaba previsto, ¡gracias! – Frank

0

Está ordenando números de coma flotante con números enteros. Los enteros no se redondean; se truncan Además, dada la forma en que realmente está haciendo la clasificación, considere usar TreeHashMap en su lugar.

(y justo que pequeñez, la convención de Java utiliza minúsculas para el método y las variables de nombres)

+0

¿TreeHashMap? ¿No es eso un oxímoron? Un mapa generalmente se implementa como una tabla hash (HashMap), o un árbol rojo-negro (TreeMap), no ambos. :-) –

+1

TreeMap: P hehe, tonto de mí – aberrant80

Cuestiones relacionadas