问题是,黑社会不会出现在战斗中。事实上,在 doBattle() 开始时打印 gangs.size() 返回 3 而不是 4。为什么?
Both triads
and grove street
强度为 9。因此它们在以下方面相等Gang.compareTo
(实施Comparable
)。因此,一个中只允许有一个TreeSet
.
如果您不想删除排序顺序重复的项目,请不要使用TreeSet
...
编辑:ComparableGang
接口描述表明了预期的内容:
/** An `IGang` ordered by identity (name) */
public interface ComparableGang extends IGang, Comparable<IGang> {}
Your compareTo
方法确实not“按身份(姓名)”排序 - 按实力排序。老实说,它首先是一个非常愚蠢的界面,因为它对于asoft
创建一个类public class GangNameComparator : Comparator<IGang>
,然后如果他们想按名称排序,则将其作为树集的比较器提供。
但是,由于他们建议您应该实现比较,因此您需要按照界面描述进行操作:
public int compareTo(IGang g) {
return name.compareTo(g.getName());
}
然而......正如您在评论中指出的那样(以及罗布的回答中指出的那样),这与打破惯例的命名相矛盾IGang
描述:
public interface IGang {
/** @return negative, 0, or positive, respectively
* if this gang is weaker than, equal to, or stronger
* than the other
*/
public int compareTo(IGang g);
}
是不可能实现的ComparableGang
以满足其自己的文档和IGang
文档。这基本上是由 asoft 的设计所打破的。
任何代码都应该能够使用IGang
执行、了解only about IGang
,并依赖于以下实施IGang
合同。然而,asoft 打破了这一假设,要求接口中的不同行为扩展IGang
.
他们添加的话是合理的更多要求 in ComparableGang
,只要他们不违反existing的要求IGang
.
请注意,这是 C# 和 Java 之间的一个重要区别。在 C# 中,具有相同签名的两个不同接口中的两个函数可以组合成一个继承它们的接口,并且这两种方法仍然不同且易于使用。在Java中,这两个方法是完全抽象的并且具有相同的签名,因此它们是被认为是 同样的方法并且实现组合接口的类只有一个这样的方法。所以in Java ComparableGang
无效,因为它无法实现满足 ComparableGang 契约和 IGang 契约的compareTo() 实现。