5

I use the following lines to sort a LinkedHashMap, but not all items are sorted, anything wrong ?

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); }
}
Steve Kuo
  • 61,876
  • 75
  • 195
  • 257
Frank
  • 30,590
  • 58
  • 161
  • 244

2 Answers2

7

When you return int, the range when average-o.average is between -1 and 1 will always return 0.

One solution is simply change your compareTo function to:

return Float.compare(average, o.average);
Steve Kuo
  • 61,876
  • 75
  • 195
  • 257
CookieOfFortune
  • 13,836
  • 8
  • 42
  • 58
0

You're sorting floating point numbers using integers. Integers don't get rounded; they get truncated. Also, given the way you're actually doing the sorting, consider using a TreeHashMap instead.

(and just to nitpick, Java convention uses lowercase for method and variables names)

aberrant80
  • 12,815
  • 8
  • 45
  • 68
  • A TreeHashMap? Isn't that an oxymoron? A map is usually implemented either as a hash table (HashMap), or a red-black tree (TreeMap), not both. :-) – C. K. Young Jul 13 '09 at 14:49