gpt4 book ai didi

java - CompareTo 和 TreeSet 的问题

转载 作者:行者123 更新时间:2023-11-30 05:03:20 24 4
gpt4 key购买 nike

我在使用 TreeSets 从我正在开发的游戏中删除一个单位时遇到问题。我正在制作一款塔防游戏,路径被分成固定长度的不同 block 。这些 block 知道其中的单元以及路径上的下一个 block 。当该单元离开 block 的边界时, block 将其从其列表中删除并将其添加到下一个 block 中。

我使用 TreeSet 来跟踪 block 中单元的顺序,这样我就可以知道哪个单元沿着路径最远。这些单位有一个位置字段,用于跟踪它们沿路径有多远,位置越高,它们就越远。

在我的一些 block 上,我注意到当它尝试从其 TreeSet 中删除一个单元时,删除返回 false。我使用了一些断点,我可以看到该单位实际上在 TreeSet 中,所以我认为我的问题是我的攻击单位的compareTo 方法。

这是我的compareTo代码:

public int compareTo(Object other) {
if (other != null && AttackingUnit.class.isAssignableFrom(other.getClass())) {
AttackingUnit o = (AttackingUnit) other;
int amount = position - o.position;
if (amount != 0) {
return amount;
} else if (amount == 0 && this == o) {
return 0;
}
}
return 1;
}

我注意到问题的一个街区是单位进入顶部、中途拐角并从右侧退出的街区。该 block 有两个 ArrayList,一个用于从上到下的单元 (enPath),另一个用于从左到右的单元 (exPath)。这是我遇到问题的代码:

for (int i = 0; i < exPath.size(); i++) {
AttackingUnit unit = exPath.get(i);
unit.stepX();
if (unit.getX() > rightX) {
nextBlock.addUnit(unit);
units.remove(unit);
exPath.remove(unit);
i--;
}
}

单位位于 exPath 和units(TreeSet)中,但units.remove(unit) 返回 false。关于如何更改 AttackingUnit 上的compareTo 来解决此问题,有什么想法吗?

最佳答案

你的compareTo方法很奇怪。首先,列表中不应该有任何类型不正确的元素,也不应该有空元素,因为这无论如何都会产生问题。因此,在这些情况下您可以简单地抛出异常,而不是返回 1

其次,正如 Steve 已经指出的那样,this == o 检查不正确 - 这违反了关系的对称性,导致找不到元素的情况。这给出了这个更简单的版本:

public int compareTo(Object other) {
AttackingUnit o = (AttackingUnit) other;
int amount = position - o.position;
return amount;
}

第三,确保当单位位于 TreeSet 中时位置(即比较结果)不会改变。如果必须更改位置,请先从集合中删除该元素,更改位置,然后再次添加。

关于java - CompareTo 和 TreeSet 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5929991/

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