使用Java中的比较器错误的TreeMap构造函数

时间:2013-10-15 08:15:34

标签: java comparator treemap

我想创建一个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 个答案:

答案 0 :(得分: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
                        }
                    });

答案 1 :(得分:0)

您应该根据条目的键对条目进行排序。所以比较器应该比较两个字符串。 (新的比较者(){...}),如其他答案所示。

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

答案 2 :(得分: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
    }
};

答案 3 :(得分: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)
                        }
                    });

如果字符串的自然排序(参见:javadoc for String#compareTo)对你没问题,你可以写:

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

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