gpt4 book ai didi

java - TreeMap 比较器函数重载

转载 作者:行者123 更新时间:2023-11-29 04:16:35 28 4
gpt4 key购买 nike

我试图添加一个自定义比较器来对 map 进行排序,以下是我的比较器,

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 进行排序。

为什么第一种方法失败了?

最佳答案

在查看 TreeMap.put 的源代码时,我们发现它直接引用了比较器:

public V put(K key, V value) {
...
//cpr is the the comparator being used
Comparator<? super K> cpr = comparator;
....
}

这意味着它没有使用您覆盖的 comparator() 方法,这就解释了为什么它不起作用。

关于java - TreeMap 比较器函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52003476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com