0

我想制作一个 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
        }
    });
4

4 回答 4

5

比较器是关键

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
                        }
                    });
于 2013-10-15T08:18:34.207 回答
0

您需要提供比较器,它比较键,而不是完整的映射条目。因此,要创建TreeMap<String,X>X是任何类型),您需要提供Comparator<String>. 这可以这样做:

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)
                        }
                    });

如果字符串的自然顺序(请参阅: String#compareTo 的javadoc)对您来说很好,您可以只写:

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

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

于 2013-10-15T08:36:31.360 回答
0

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

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

于 2013-10-15T08:28:33.557 回答
0

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

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
    }
};
于 2013-10-15T08:35:25.583 回答