Java TreeMap 未根据传递的比较器排序

Java TreeMap not sorted according to passed comparator

我已经实现了一个包含蓝图的 TreeMap(以简化它)。

private TreeMap<BuildingFloorKey, Blueprint> blueprints = new TreeMap<>((o1, o2) -> {
        int value = o1.compareTo(o2);
        return value;
});

要使用建筑物(在我的例子中称为 complex)和楼层作为元组键,我编写了以下内容 class:

public static class BuildingFloorKey {
    private Complex mComplex;
    private int mFloor;

    public BuildingFloorKey(Complex complex, int floor){
        mComplex = complex;
        mFloor = floor;
    }

    @Override
    public boolean equals(Object other) {
        if (!(other instanceof BuildingFloorKey)) return false;
        BuildingFloorKey that = (BuildingFloorKey) other;
        return mFloor == that.mFloor && mComplex.equals(that.mComplex);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(new Object[]{mComplex, mFloor});
    }

    public int compareTo(BuildingFloorKey otherKey){
        if(this.equals(otherKey)) return 0;

        //same complex -> compare floors
        else if (this.getComplex().equals(otherKey.getComplex())){
            return otherKey.getFloorInt() - this.getFloorInt();
        }
        //different complexes (incl. some modification for special cases)
        else return -(Math.abs(otherKey.mFloor + 2) + 100);
    }
}

我正在开发一个 Android 应用程序,我想通过按钮点击蓝图。为此,我使用方法 TreeMap.lowerKey(otherKey) 和 TreeMap.higherKey(otherKey)。像这样:

@Override
    public void onNextPlanClicked() {
           nextFloorPlan = blueprints.higherKey(currentlyDisplayedPlan);
           drawFloorPlan(nextFloorPlan);
        }

例如,我有一个用例,其中的蓝图集是

(格式:复杂|楼层)。不幸的是,它在 TreeMap 中没有正确排序(如您所见 - 上面的列表在调试器中的排序类似于 TreeMap 的条目)。

我阅读了一些有关使用区分大小写的字符串进行 TreeMap 排序的内容。但我实际上使用的是整数。所以我不明白为什么排序和使用 lowerKey() 和 higherKey() 不能正常工作。我搞砸了比较器吗?有人可以帮忙吗?

我认为你的问题很简单,你的 compareTo 方法应该有一个覆盖。您需要将 implements Comparable 添加到您的 BuildingFloorKey 定义,然后它将您的 compareTo 参数作为 TreeMap 可以识别的可比较对象。