我正在尝试创建一个带有排序键的 Map
,先按字母顺序排序,最后按数字排序。为此,我使用了带有自定义 Comparator
的 TreeMap
:
public static Comparator<String> ALPHA_THEN_NUMERIC_COMPARATOR =
new Comparator<String> () {
@Override
public int compare(String first, String second) {
if (firstLetterIsDigit(first)) {
return 1;
} else if (firstLetterIsDigit(second)) {
return -1;
}
return first.compareTo(second);
}
};
private static boolean firstLetterIsDigit(String string) {
return (string == null) ? false : Character.isDigit(string.charAt(0));
}
我编写了以下单元测试来说明出了什么问题:
@Test
public void testNumbericallyKeyedEntriesCanBeStored() {
Map<String, String> map = new HashMap<>();
map.put("a", "some");
map.put("0", "thing");
TreeMap<String, String> treeMap = new TreeMap<>(ALPHA_THEN_NUMERIC_COMPARATOR);
treeMap.putAll(map);
assertEquals("some", treeMap.get("a"));
assertEquals("thing", treeMap.get("0"));
}
结果:
java.lang.AssertionError:
Expected :thing
Actual :null
最佳答案
检查您的比较器代码。比较“0”和“0”是否会返回 0?不,它不是,因为如果您的字符串以数字开头,您不会检查是否相等。如果两个字符串都以数字开头,您也不会返回正确的顺序。
关于Java TreeMap 自定义比较器奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30219835/