【问题标题】:How to override comparator for TreeMap [duplicate]如何覆盖 TreeMap 的比较器 [重复]
【发布时间】:2020-08-09 07:18:35
【问题描述】:

我目前正在实现一个 TreeMap 来存储键值对,其中键是常规字符串,值是对象堆栈。据我了解(这是我第一次使用 Map,所以我很绿色),TreeMap 类使用键的自然顺序对自身进行排序,但是我希望它按字典顺序排序。同样据我了解,它的比较器方法可以被覆盖来实现这一点。我已经知道如何使它按字典顺序排列,我的问题在于我不知道如何实际覆盖该方法。我是否将被覆盖的部分放在我正在使用 TreeMap 的类中?我是否必须创建一个名为 tree map 的单独类并在那里编写新方法?覆盖比较方法的特殊语法(如果有)是什么?如果这个问题看起来很基本,我很抱歉,但我对此很陌生,并且在网上查找我一直在努力寻找我完全理解的解释。提前感谢您的帮助和耐心等待!

【问题讨论】:

    标签: java sorting compare comparator treemap


    【解决方案1】:

    试试这个例子:

    class SortAscendingComparator implements Comparator<String> {
      @Override
      public int compare(String s1, String s2) {
        return s1.compareTo(s2);
      }
    }
    
    public class Demo {
      public static void main(String[] args) {
        SortedMap<String, String> map = new TreeMap<>(new SortAscendingComparator());
        map.put("c", "c");
        map.put("a", "a");
        map.put("b", "b");
        // Displays: {a=a, b=b, c=c}
        System.out.println(map);
      }
    }
    

    【讨论】:

    • 好的,所以想法是在自己的类中定义新的比较器,然后当我调用实际的树图时,我会在括号之间调用那个类?此外,很快,在将您的代码与我的代码进行比较时,我注意到您使用“SortedMap map = new TreeMap(new SortAscendingComparator())”初始化了 TreeMap,而我用我的代码编写了“TreeMap > map = new TreeMap()"。用 SortedMap 初始化 TreeMap 有什么不同吗?
    • @abdcg TreeMap&lt;String, String&gt; map = new TreeMap&lt;&gt;(new SortAscendingComparator()); 也可以。 SortedMapTreeMap 实现的接口。
    【解决方案2】:

    TreeMap 类具有接受自定义Comparator 对象的特定构造函数。您可以将您的逻辑放在传递的比较器中。

    【讨论】:

      【解决方案3】:

      实际上,您可以将自己的 Comparator 实例传递给 TreeMap 的构造函数之一。使用 lambda 表达式,您甚至可以将其简化为:

      TreeMap<String, String> t = new TreeMap<>(String::compareTo);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 2019-02-07
        • 2021-12-25
        • 2020-02-24
        相关资源
        最近更新 更多