【问题标题】:Java sort a Hashmap on ValueJava 对 Value 的 Hashmap 进行排序
【发布时间】:2015-09-10 08:07:22
【问题描述】:

边学边学 Java(Python 背景)。 Java 7 代码中的简单字数统计程序(不能使用 J8!)。

我有一个 word:count 对的哈希图。现在我需要按计数(递减顺序)排序,并打破按字母顺序使用单词的关系。

已阅读 s/o,我尝试了一个树形图,但它似乎不能很好地处理关系,所以我认为这是不对的。

我已经看到发布了许多定义新类 sortbyvalue 并定义比较器的解决方案。这些对我不起作用,因为我需要将解决方案全部包含在现有类中。

我正在寻找有关此想法的反馈:

  • 遍历哈希图中的映射条目(我)
  • 使用 me.getKey = K 和 me.getValue = V
  • new Map.Entry reverse_me = (V,K) {不确定这个语法}
  • 将 reverse_me 添加到列表中
  • 在地图上为我重复一遍
  • List.sort { 这是我不确定的地方,关于如何排序,不知道如何编写比较器。此时每个 List 元素将是一个 (count, word) 对,并且 sort() 应该按 count 递减排序,然后在相同计数的情况下按单词按字母顺序排序)

这将是最终输出。

这是合乎逻辑的进展吗?我可以从许多帖子中看出,关于如何做到这一点有很多意见,但这是我可以总结的一个。

另外,不能用番石榴。

【问题讨论】:

  • TreeMap 完美地处理关系(但排序发生在键上,当然不是值,使用TreeSet 进行值排序),错误很可能与您的代码有关。另一方面,HashMap 不能保留订单(LinkedHashMap 除外,但即使这样也无法排序)。
  • 首先,在java,您需要了解Collections.sort(...)ComparatorComparable。您将需要这些知识来解决您的问题。

标签: java sorting collections hashmap


【解决方案1】:

只要地图条目没有改变,这个集合就反映了正确的顺序

        HashMap<String, Integer> map = new HashMap<>();
        TreeSet<Map.Entry<String, Integer>> entriesSet = new TreeSet<>(new Comparator<Map.Entry<String, Integer>>(){
            @Override
            public int compare(Map.Entry<String, Integer> me1, Map.Entry<String, Integer> me2) {
                return me1.getValue().compareTo(me2.getValue());  
            }
        });
        entriesSet.addAll(map.entrySet());

【讨论】:

  • 我已经使用了这个公认的答案,主要是因为它首先出现。不过,我确实喜欢这个 TreeSet 解决方案,它看起来非常简单。随着我对 Java 的了解越来越多,我希望能够理解这一点。
【解决方案2】:

您可以从地图中创建Entry 集的List。使用Collections.sort()List 进行排序。当Value(s) 相同时,您可以传递自定义Comparator 以按Key 排序。

Set<Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
{
  public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
  {
    int result = (o2.getValue()).compareTo( o1.getValue() );
    if (result != 0) {
      return result;
    } else {
      return o1.getKey().compareTo(o2.getKey());
    }
  }
} );

【讨论】:

  • @fabian 更新了示例。谢谢。
  • 我使用了它,它在我的应用程序中工作。除了作为第一个答案之外,我认为对于具有 Python 而不是 Java 背景的编码器来说,这是一个非常直观的解决方案。谢谢
猜你喜欢
  • 2014-12-11
  • 2012-09-28
  • 2017-09-22
  • 2017-07-02
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多