我想创建一个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
}
});
答案 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
的事实。