【问题标题】:order a hash map by the size of it's values. java按其值的大小对哈希映射进行排序。爪哇
【发布时间】:2015-01-25 12:45:41
【问题描述】:

此哈希映射使用称为 Sentence 的字符串对象作为键,这是程序中不可更改的重要部分。数据应该按照对应值的大小来组织,它是一个整数,最大的在前,然后降到最低,1 是最小的界限,每个分区之间的顺序并不重要。使用此代码可以实现吗?

//map to store learned 'rules'
Map<Sentence, Integer> ruleCount = new HashMap<>();
//store data
public void numberRules(Sentence sentence) 
{
    if (!ruleCount.containsKey(sentence))
    {
        ruleCount.put(sentence, 0);
    }
    ruleCount.put(sentence, ruleCount.get(sentence) + 1);
}

【问题讨论】:

    标签: java sorting hashmap


    【解决方案1】:

    HashMap 没有顺序。有排序的地图,但它们是按键排序的,而不是按值排序的。完成修改后,只需将地图转换为列表,然后对列表进行排序:

    List<Map.Entry<Sentence, Integer>> entries = new ArrayList<>(ruleCount.entrySet());
    Collections.sort(entries, new Comparator<Map.Entry<Sentence, Integer>>() {
        @Override
        public int compare(Map.Entry<Sentence, Integer> e1, Map.Entry<Sentence, Integer> e2) {
            return e1.getValue().compareTo(e2.getValue());
        }
    });
    

    【讨论】:

    • 然后我在 ruleCount 上调用 compare?
    • 然后你有一个条目列表,按它们的值排序。你可以用这个列表做任何你想做的事情。条目包含句子作为键,计数作为值。
    • 看起来不错,但请您帮我了解一下我是如何打印内容的,这样我才能看到它的外观?
    • System.out.println(entries);。此外,List 和 Map.Entry 是具有 javadoc 的标准类。阅读 javadoc。这就是您学习如何使用课程的方式。 docs.oracle.com/javase/7/docs/api/java/util/List.html, docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html
    • 太棒了!谢谢你的文件。教人钓鱼!
    【解决方案2】:

    您不能(仅)使用地图来做到这一点。地图不按值对条目进行排序。

    一种可能的解决方案是将地图的条目复制到一个数组中,然后对该数组进行排序。但是,如果您需要重复排序,那会很昂贵。

    另一种方法是创建(实际上)Map&lt;Sentence, Record&gt;TreeSet&lt;Record&gt; 组合的数据结构。 Record 有一个可变的int 计数字段和一个不可变的Sentence 字段。 TreeSet 是按计数排序的,当您更新计数时,您需要删除并重新插入 Record

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多