在集合中搜索同一确切对象的不同实例

时间:2013-01-09 03:24:50

标签: java object set instance loops

我在World类中有一个名为collidable的对象:

Set<Collidable> collidables = new HashSet<Collidable>();

在尝试开发碰撞检测系统(用于球)时,我为X和Y做了两个for循环。

cboxX = (int) Math.floor(position.x - RADIUS);
cboxY = (int) Math.floor(position.y - RADIUS);
cboxW = Math.abs((int) Math.ceil(nextPosition.x + RADIUS) - (int) Math.floor(position.x - RADIUS));
cboxH = Math.abs((int) Math.ceil(nextPosition.y + RADIUS) - (int) Math.floor(position.y - RADIUS));

for (int x = cboxX; x <= cboxW + cboxX - 1; x++)
{
    for (int y = cboxY; y <= cboxH + cboxY; y++)
    {

    }
}

这里的一切都很好。但是,在for循环中,我试图检查带有x和y参数的可碰撞物,但是由于我正在创建一个可碰撞的新实例(虽然参数与先前生成的参数完全相同),它总会出现错误:

world.collidables.add(new Block(new Vector2(x, y)));
System.out.println(world.collidables.contains(new Block(new Vector2(x, y)))); //returns false

但是,如果我使用相同的块实例,它将变为true:

Block b = new Block(new Vector2(x, y))
world.collidables.add(b);
System.out.println(world.collidables.contains(b)); //returns true

然而,这是不可接受的,因为拥有两个for循环的完整原因是不必遍历每个可碰撞的每次更新。

我要问的是,有没有人知道如何确定可碰撞是否在我指定的位置,而不必迭代整个集合?

1 个答案:

答案 0 :(得分:5)

您需要为自己提供两种方法的实现:

int hashCode()
boolean equals(Object o)

当且仅当两个实例的属性(向量)相等时,才应实现c1.hashCode() == c2.hashCode()这些方法。同时hashCode()必须与文档所述的意义上的equals(Object o)一致:

  • 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,此整数不需要保持一致。
  • 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。
  • 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。