我试图让它工作很长一段时间,但似乎无法得到它。我有一个由 Block 建造的对象 Tower。我已经使用数组让它工作了,但我想学习 Set 的。我想获得与此类似的功能:
public class Tower {
public Tower(){
}
public Tower add(Block k1){
//(...)
//if block already in tower, return "Block already in tower"
}
public Tower delete(Block k1){
//(...)
//if block already dleted, show "No such block in tower"
}
}
有人给了我一些代码,但我在尝试使用它时经常出错:
Set<Block> tower = new HashSet<Block>();
boolean added = tower.add( k1 );
if( added ) {
System.out.println("Added 1 block.");
} else {
System.out.println("Tower already contains this block.");
}
如何实施?
原文由 sasklacz 发布,翻译遵循 CC BY-SA 4.0 许可协议
您需要研究的第一件事是
java.util.Set
API 。这是一个如何使用其方法的小示例:
熟悉 API 后,您可以使用它来包含更多有趣的对象。如果您还不熟悉
equals
和hashCode
合同,现在是开始的好时机。简而言之:
@Override
两者都有或没有;永远不会只有一个。 (非常重要,因为它必须满足属性:a.equals(b) == true --> a.hashCode() == b.hashCode()
boolean equals(Thing other)
代替;这不是正确的@Override
。x, y, z
,equals
必须是:x.equals(x)
。x.equals(y)
当且仅当y.equals(x)
x.equals(y) && y.equals(z)
,那么x.equals(z)
x.equals(y)
除非对象发生了变化,否则不得改变x.equals(null) == false
hashCode
的总合同是:equals
一致:如果x.equals(y)
,则x.hashCode() == y.hashCode()
equals
和hashCode
之间保持一致。接下来,您可能想要对对象进行排序。您可以通过使您的类型实现
Comparable
或通过提供单独的Comparator
来做到这一点。使用其中任何一个都可以轻松对对象进行排序(
Arrays.sort
,Collections.sort(List)
)。它还允许您使用SortedSet
,例如TreeSet
。关于stackoverflow的进一步阅读: