2009-07-13 7 views
5

J'utilise les lignes suivantes pour trier un LinkedHashMap, mais tous les éléments ne sont pas triés, quelque chose ne va pas?Comment trier un LinkedHashMap par le champ de sa classe de valeur?

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

Je vais avoir du mal à obtenir après la convention de codage. ;) – jsight

+0

Oui, toutes les majuscules rendent une lecture difficile. – aberrant80

+0

Variable et noms de méthodes corrigés .. –

Répondre

7

Lorsque vous revenez int, la plage en moyenne o.average est entre -1 et 1 retournera toujours 0.

Une solution est simplement changer votre fonction compareTo à:

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

Oui, vous êtes concis et précis, maintenant cela fonctionne comme prévu, merci! – Frank

0

Vous triez des nombres à virgule flottante à l'aide d'entiers. Les nombres entiers ne sont pas arrondis; ils sont tronqués. En outre, étant donné la façon dont vous effectuez le tri, pensez à utiliser un TreeHashMap à la place.

(et juste pour pinailler, convention Java utilise en minuscules pour les noms de méthode et variables)

+0

Une TreeHashMap? N'est-ce pas un oxymore? Une carte est généralement implémentée sous la forme d'une table de hachage (HashMap) ou d'un arbre rouge-noir (TreeMap), mais pas les deux. :-) –

+1

TreeMap: P hehe, idiot – aberrant80

Questions connexes