5

次の行を使用して LinkedHashMap を並べ替えますが、すべての項目が並べ替えられるわけではありません。何か問題がありますか?

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); }
}
4

2 に答える 2

7

int を返すと、 average-o.average が -1 から 1 の間の範囲は常に 0 を返します。

1 つの解決策は、compareTo 関数を次のように変更することです。

return Float.compare(average, o.average);
于 2009-07-13T03:02:16.663 に答える
0

整数を使用して浮動小数点数を並べ替えています。整数は丸められません。それらは切り捨てられます。また、実際にソートを行っている方法を考えると、代わりに TreeHashMap を使用することを検討してください。

(そして、ちょっとしたことですが、Javaの慣習では、メソッドと変数の名前に小文字を使用しています)

于 2009-07-13T04:16:41.920 に答える