【问题标题】:print based on number of occurrences根据出现次数打印
【发布时间】:2013-04-02 13:43:38
【问题描述】:

我正在尝试根据哈希图中每个键的出现次数对程序的输出进行排序。我希望它以出现的递增顺序打印出来。它已经正确打印出来了,只是没有按顺序打印。我查看了此页面Sort a Map<Key, Value> by values,但对于哪些仍然有效,哪些无效,这确实令人困惑。

哈希图-

Map<String, NumberHolder> uaCount = new HashMap<String, NumberHolder>();

印刷部分

for(String str : uaCount.keySet())
    {
        String [] arr = str.split(":");                     
        long average = uaCount.get(str).sumtime_in_milliseconds / uaCount.get(str).occurrences;         
        System.out.println(arr[0] + " ---> " + arr[1] + "---> " + arr[2] + "--->" + arr[3] +  "\nAverage = "  + average + " milliseconds \nOccurrences = " + uaCount.get(str).occurrences);
    }

我的NumberHolder 类已定义

public static class NumberHolder
{
    public int occurrences = 0;
    public int sumtime_in_milliseconds = 0;     
}

【问题讨论】:

  • 顺便说一句,如果您可以添加外部依赖项,请查看 Google Guava multimaps/multisets。他们为你做点数,并有很好的 API 用于排序。

标签: java hashmap comparator


【解决方案1】:

编辑:误读要求。见下文。

你需要把所有的物品都拿出来如果你想保持原来的样子,这样做:

final ArrayList<Map.Entry<String,NumberHolder>> entries 
    = new ArrayList<Map.Entry<String,NumberHolder>>(uaCount.entrySet());

Comparator<Map.Entry<String,NumberHolder>> comp = new Comparator<Map.Entry<String,NumberHolder>>() {
    @Override
    public int compare(Map.Entry<String, Something> o1, Map.Entry<String, Something> o2) {
        return Integer.compare(o1.getValue().occurrences,o2.getValue().occurrences);
    }
};

Collections.sort(entries, comp);

for(Map.Entry<String,NumberHolder> entry : entries)
{
    ... // use entry.getKey(), entry.getValue()
}

请注意,您引用的问题似乎有很多有用的答案和其他信息,尤其是在性能问题时。

【讨论】:

  • 此解决方案是按键排序,OP 需要按“出现”(即值对象的字段)进行排序。请修复它。
  • @ben75 谢谢 - 我完全误读了。请看一下我的解决方案。
  • 次要吹毛求疵:您不应该使用减法进行比较,因为当值接近 Integer.MAX_VALUE 或 .MIN_VALUE 时它会爆炸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
相关资源
最近更新 更多