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);
}
例如,我有一个用例,其中的蓝图集是
- 04|02
- 03|03
- 04|-1
- 03|00
(格式:复杂|楼层)。不幸的是,它在 TreeMap 中没有正确排序(如您所见 - 上面的列表在调试器中的排序类似于 TreeMap 的条目)。
我阅读了一些有关使用区分大小写的字符串进行 TreeMap 排序的内容。但我实际上使用的是整数。所以我不明白为什么排序和使用 lowerKey() 和 higherKey() 不能正常工作。我搞砸了比较器吗?有人可以帮忙吗?
我认为你的问题很简单,你的 compareTo 方法应该有一个覆盖。您需要将 implements Comparable 添加到您的 BuildingFloorKey 定义,然后它将您的 compareTo 参数作为 TreeMap 可以识别的可比较对象。
我已经实现了一个包含蓝图的 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);
}
例如,我有一个用例,其中的蓝图集是
- 04|02
- 03|03
- 04|-1
- 03|00
(格式:复杂|楼层)。不幸的是,它在 TreeMap 中没有正确排序(如您所见 - 上面的列表在调试器中的排序类似于 TreeMap 的条目)。
我阅读了一些有关使用区分大小写的字符串进行 TreeMap 排序的内容。但我实际上使用的是整数。所以我不明白为什么排序和使用 lowerKey() 和 higherKey() 不能正常工作。我搞砸了比较器吗?有人可以帮忙吗?
我认为你的问题很简单,你的 compareTo 方法应该有一个覆盖。您需要将 implements Comparable 添加到您的 BuildingFloorKey 定义,然后它将您的 compareTo 参数作为 TreeMap 可以识别的可比较对象。