Java TreeMap 自定义比较器奇怪的行为

标签 java comparator treemap

我正在尝试创建一个带有排序键的 Map,先按字母顺序排序,最后按数字排序。为此,我使用了带有自定义 ComparatorTreeMap:

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/

相关文章:

java - Firebase:访问用户对象内部的ArrayList

c# - 通用列表比较器不适用于 list<keyvaluePair>

java - TreeMap高低键整数排序

Java Treemap和ArrayList传递项

java - 两个图像之间快速切换?

java - 排序数组中最右最小元素的索引

java - 我在 libGDX 中缺少什么来获取 Actor 上的 InputEvent?

java - 使用比较器对包含整数的字符串进行排序

java - 在java中实现比较器接口(interface)

java - HashMap/TreeMap 对我的键进行排序