【问题标题】:TreeMap Constructor using comparator error in Java在Java中使用比较器错误的TreeMap构造函数
【发布时间】:2013-10-22 23:10:00
【问题描述】:

我想制作一个 TreeMap,以便每次在 TreeMap 中插入一个条目 - 该条目会根据运行时的值进行排序。 (需要 O(logN) 时间。)所以,我用它的构造函数定义了一个 TreeMap,如下所示:: 我不明白问题出在哪里......我很困惑。谁能解释一下错误/问题?

代码::

Map<String,Integer> tm = 
  new TreeMap<String,Integer>(new Comparator<Map.Entry<String,Integer>>(){

        @Override
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            throw new UnsupportedOperationException("Not supported yet."); // implement logic here
        }
    });

【问题讨论】:

    标签: java comparator treemap


    【解决方案1】:

    您需要提供比较器,它比较键,而不是完整的映射条目。所以要创建TreeMap&lt;String,X&gt;(X 是任何类型)你需要提供Comparator&lt;String&gt;。可以这样完成:

    Map<String,Integer> tm = new TreeMap<String,Integer>(new Comparator<String>(){
                            @Override
                            public int compare(String o1, String o2) {
                                // implement logic here
                                // sample implementation below 
                                return o1.comparateTo(o2)
                            }
                        });
    

    如果字符串的自然顺序(请参阅:javadoc for String#compareTo)适合您,您可以写:

    Map<String,Integer> tm = new TreeMap<String,Integer>();
    

    请注意,在这两种情况下,键的顺序是相同的。在这两种情况下,String#compareTo 方法都用于比较键。仅在第一个示例中,我们明确提供了比较器,而在第二个示例中,我们使用了 String 实现 Comparable 的事实。

    【讨论】:

    • 这段代码对我不起作用。您认为它已被弃用吗?
    【解决方案2】:

    如果你真的需要按值排序,你应该为键创建一个新对象,也包含你的值:

    class MyKey {
        String str;
        Integer i;
        ...
    }
    Map<MyKey,Integer> tm = new TreeMap<MyKey, Integer>(new Comparator<MyKey>(){
        @Override
        public int compare(MyKey o1, MyKey o2) {
             String str1 = o1.str;
             String str2 = o2.str;
             // implement logic here
        }
    };
    

    【讨论】:

      【解决方案3】:

      您应该根据条目的键对条目进行排序。所以比较器应该在这里比较两个字符串。 (new Comparator(){...}) 此处其他答案中的建议。

      查看构造函数文档: http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html#TreeMap(java.util.Comparator)

      【讨论】:

        【解决方案4】:

        比较器是针对key的

        Map<String,Integer> tm =
                            new TreeMap<String,Integer>(new Comparator<String>(){
                                @Override
                                public int compare(String o1, String o2) {
                                    throw new UnsupportedOperationException("Not supported yet."); // implement logic here
                                }
                            });
        

        【讨论】:

        • 所以,如果我希望 Treeap 基于值或基于键值组合进行排序 .... 那么“新比较器 ()”中应该有什么变化制作??
        • @Ronin 当我们说地图已排序时,我们的意思是条目按键排序。 Map 是一个键值集合;它不像列表。
        • 搜索key-value没有任何意义;基本上对于引擎盖下的这张地图,你会得到一棵钥匙树。如果您想要键值组合看起来不是地图而是集合(docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html 并且您使用字符串和 int 构建自定义对象)。对于这张地图,当您搜索密钥时,您会得到 log n;
        • 是否可以通过更改“new Comparator( )”或以其他方式获取具有仅基于值对其条目进行排序的属性的 TreeMap?
        • 对不起;也许我不明白你想要实现什么;那你为什么需要钥匙呢?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        相关资源
        最近更新 更多