【问题标题】:Searching for a different instance of the same exact object, within a set在集合中搜索相同对象的不同实例
【发布时间】:2013-01-09 03:24:49
【问题描述】:

我在 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 循环的全部原因是不必遍历每个可碰撞的、每次更新。

我要问的是,有没有人知道一种方法来获取可碰撞对象是否在我指定的位置,而不必遍历整个集合?

【问题讨论】:

  • 再一次,这需要迭代,出于性能原因我不能这样做。如果可以的话,我会迭代并检查该对象的向量是否与我所在的位置具有相同的值。

标签: java object set instance loops


【解决方案1】:

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

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 方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多