【问题标题】:How to sort a LinkedHashMap by its value class's field?如何按其值类的字段对 LinkedHashMap 进行排序?
【发布时间】:2009-07-13 02:58:48
【问题描述】:

我用下面几行来对一个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); }
}

【问题讨论】:

  • 我很难通过编码约定。 ;)
  • 是的,所有大写字母都难以阅读。
  • 变量和方法名称已修复..

标签: java sorting linkedhashmap


【解决方案1】:

当你返回int时,average-o.average在-1到1之间的范围总是会返回0。

一种解决方案是将您的 compareTo 函数更改为:

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

【讨论】:

  • 是的,你简洁明了,现在它按预期工作了,谢谢!
【解决方案2】:

您正在使用整数对浮点数进行排序。整数不会四舍五入;他们被截断。此外,考虑到您实际进行排序的方式,请考虑改用 TreeHashMap。

(只是为了挑剔,Java 约定使用小写的方法和变量名称)

【讨论】:

  • 一个 TreeHashMap?这不是矛盾吗?映射通常实现为哈希表 (HashMap) 或红黑树 (TreeMap),而不是两者。 :-)
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2019-02-17
  • 2019-06-26
相关资源
最近更新 更多