【问题标题】:Java TreeMap ComparatorJava TreeMap 比较器
【发布时间】:2012-10-18 04:23:59
【问题描述】:

我需要一个 TreeMap 的比较器。我应该在我的 TreeMap 的构造函数中匿名写这个吗?我怎么能写我的比较器。目前,Java 不喜欢我的代码(我可以匿名这样做吗?):

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<Entry<String, Double>>()
    {
        public int compare(Entry<String, Double> o1, Entry<String, Double> o2)
        {
            return o1.getValue().compareTo(o2.getValue());
        } 
    });
  1. 我可以匿名进行上述操作吗?
  2. 我还能怎么做?
  3. 我想按值而不是键对 myMap 进行排序

【问题讨论】:

  • TreeMap 比较器签名仅在键上。例如:``` new Comparator() { @Override public int compare(String a, String b) { return 0; } ```

标签: java comparator treemap sortedmap


【解决方案1】:

您不能按值对TreeMap 进行排序。

基于红黑树的 NavigableMap 实现。地图根据其键的自然顺序排序,或者由地图创建时提供的 Comparator 排序,具体取决于使用的构造函数 您需要为Comparator&lt;? super K&gt; 提供comparator,以便您的比较器应该在键上进行比较。

要对值进行排序,您需要SortedSet。使用

SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
            new Comparator<Map.Entry<String, Double>>() {
                @Override
                public int compare(Map.Entry<String, Double> e1,
                        Map.Entry<String, Double> e2) {
                    return e1.getValue().compareTo(e2.getValue());
                }
            });

  sortedset.addAll(myMap.entrySet());

举个例子

    SortedMap<String, Double> myMap = new TreeMap<String, Double>();
    myMap.put("a", 10.0);
    myMap.put("b", 9.0);
    myMap.put("c", 11.0);
    myMap.put("d", 2.0);
    sortedset.addAll(myMap.entrySet());
    System.out.println(sortedset);

输出:

  [d=2.0, b=9.0, a=10.0, c=11.0]

【讨论】:

  • 如何一次向 myMap 添加一个元素? myMap.add(Map.Entry new Map.Entry(vStr, cur));
  • @CodeKingPlusPlus 否。您仅使用 put 方法检查添加的示例。完成后将值放入 M​​ap 使用 SortedSet 对值进行排序。
  • 这可行,但它会删除重复值。但我想在列表中保留重复值。谁能帮帮我?
  • ..或“即使您获取元素并对其进行排序,当您将它们放回 TreeMap 时,顺序仍然由 key 比较器/自然顺序决定”。相反,您可以将有序条目插入到 LinkedHashmap 中,以至少返回元素的有序映射视图。
  • @PriyankaAlachiya 使用 ArrayList 而不是集合。将地图的元素添加到列表中,并在 Collections.sort() 中传入比较器。为我工作。在 leetcode 上解决“前 K 频繁元素”时,我也使用了技术
【解决方案2】:

比较器应该只用于键,而不是整个条目。它根据键对条目进行排序。

你应该把它改成如下内容

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<String>()
    {
        public int compare(String o1, String o2)
        {
            return o1.compareTo(o2);
        } 
});

更新

您可以执行以下操作(在地图中创建条目列表并根据值对列表进行排序,但请注意这不会对地图本身进行排序)-

List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet());
    Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() {
        @Override
        public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
            return o1.getValue().compareTo(o2.getValue());
        }
    });

【讨论】:

  • @CodeKingPlusPlus:您不能根据值对地图本身进行排序。但是您可以获取条目列表并对其进行排序。但是,除非您切换键和值,否则拥有 TreeMap 可能没有意义。
【解决方案3】:

您可以滑动键和值。例如

        String[] k = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil"};
        int[] v = {341, 273, 278, 329, 445};
        TreeMap<Integer,String>a=new TreeMap();
        for (int i = 0; i < k.length; i++) 
           a.put(v[i],k[i]);            
        System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey());
        a.remove(a.firstEntry().getKey());
        System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey());

【讨论】:

  • 这是试图解决最后一个问题,而不是前两个问题。
猜你喜欢
  • 2010-12-19
  • 2022-01-19
  • 1970-01-01
  • 2019-06-28
  • 2019-02-07
  • 2013-10-22
  • 2012-04-24
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多