我试图添加自定义分隔栏来对地图进行排序, 以下是我的比较器,
public static class MyComparator implements Comparator<String> {
private String NAME_REGEX = "M\\d+";
public int compare(String o1, String o2) {
if (o1.matches(NAME_REGEX) && o2.matches(NAME_REGEX)) {
try {
return Integer.parseInt(o1.substring(1)) - Integer.parseInt(o2.substring(1));
} catch (NumberFormatException ex) {
return o1.compareTo(o2);
}
} else {
return o1.compareTo(o2);
}
}
}
下面是我的用法
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>() {
@Override
public Comparator<? super String> comparator() {
return new MyComparator();
}
};
map.put("M10", "data");
map.put("M9", "data");
map.put("M11", "data");
map.put("M12", "data");
map.put("M6", "data");
for (String keys : map.keySet()) {
System.out.print(keys);
}
}
此代码对树形图的比较机制没有影响。
但是当我将MyComparator
实例作为构造函数参数传递时,键将使用MyComparator
进行排序。
为什么第一种方法失败了?
答案 0 :(得分:3)
查看TreeMap.put
的来源时,我们看到它直接引用了比较器:
public V put(K key, V value) {
...
//cpr is the the comparator being used
Comparator<? super K> cpr = comparator;
....
}
这意味着它没有使用覆盖的comparator()
方法,这说明了为什么它不起作用。