【问题标题】:best way to store coordinates in arrays and comparing them in java?将坐标存储在数组中并在java中比较它们的最佳方法?
【发布时间】:2014-02-21 15:15:18
【问题描述】:

寻求java帮助

我的编程时间为 1.5 周,因此请尝试为白痴提供简单的答案。这个答案可能就在那里,我可能傻到意识到我已经读过了。

所以我有一堆对象实例,我想添加 Instance.position 这是

double[] position = (x,y);

到某种数组/列表/堆栈,所以我可以检查不同的对象 Instance.position 是否与我设置到数组/堆栈/列表的对象相同。
这就是我所拥有的:

public ArrayList<double[]> objPositions = new ArrayList<double[]>();

public boolean isThereAObj(double[] userPosition){ if (objPositions.contains(userPosition)); return true; } 这不起作用..(我认为)

前面已经定义了数组列表 理想情况下,我的数组列表可以是对象,我可以通过比较对象的位置来检查对象元素的位置。

所以基本上我想要一个列表,其中包含我在程序中创建的所有对象的所有实例,然后我希望能够将它们的一个或多个元素与不同的对象(不在列表中)进行比较

【问题讨论】:

  • 不要惊慌。肯定有人帮你。向我们展示您的代码。
  • 所以您已经给出了一组 2D 点(如 double[] 数组)并且想要检查该集合中是否已经包含特定(新)点?
  • public ArrayList<double> wallPositions = new ArrayList<double>(); public boolean isThereAWall(double[] userPosition){ if (wallPositions.contains(userPosition));返回真; }</double></double>
  • 是的,这就是我想做的事
  • 请在您的代码周围加上引号,不要用“代码”包围它:public ArrayList&lt;double[]&gt; wallPositions = new ArrayList&lt;double[]&gt;(); public boolean isThereAWall(double[] userPosition){ if (wallPositions.contains(userPosition)); return true; } 并编辑您的初始帖子以使代码可读。

标签: java arrays list sorting double


【解决方案1】:

这里有几个问题。首先,将 2D 点描述为 2 元素 double[] 数组不是很优雅。相反,您应该考虑使用java.awt.geom.Point2D 对象:

Point2D p = new Point2D.Double(x,y);

这使得您正在寻找的方法的实现更加容易:

private final List<Point2D> wallPositions = new ArrayList<Point2D>(); 
public boolean isThereAWall(Point2D userPosition) { 
    return wallPositions.contains(userPosition); 
}

您当前尝试的问题是double[] 数组不知道您正在寻找的“平等”概念。 (更正式地说:没有适合他们的Object#equals(Object) 方法的实现)

然而,如果你想坚持你的双数组(虽然我确实推荐这个),你可以做类似的事情

private final List<double[]> wallPositions = new ArrayList<double[]>(); 

public boolean isThereAWall(double[] userPosition) { 
    for (double entry[] : wallPositions) {
        if (Arrays.equal(entry, userPosition)) {
            return true;
        }
    }
    return false;
}

但可能(在两种情况下)还有另一个警告,即double 值的精度有限。 非常少数情况适合比较double 值的身份(与==)。但是这是否真的是一个问题取决于您的应用案例。

【讨论】:

  • 那么如果我想在 "Point2d p" 中的 x 或 y 值上添加一个数字...假设我想将对象从 1.0,1.0 移动到 2.0, 1.0?
  • @user3337754 p.setLocation(p.getX()+1, p.getY());
  • 它是“java.awt.geom.Point2D”
【解决方案2】:

使用Point2D.Double,这恰好意味着在Point 对象中存储2 个doubles。您可以像现在一样在ArrayList 中保留多个点。要检查一个点是否已经存在,您只需遍历它并调用.equals(newPoint) 来比较这些点。但是,由于double 精度点可能永远不会彼此相等,因此您可能需要检查两个点之间是否在一定的小距离内(同样,以equals() 为例)。

【讨论】:

  • 好的,这是我的简短版本 ;-) 顺便说一句:Point2D 已经覆盖了equals,所以您可以直接调用list.contains(point) 而无需手动循环。但是,精度可能仍然是一个问题,对于某些“epsilon-comparison”,无论如何都必须再次进行手动循环
  • 如果我只有一个实例数组,我可以与 Instance.Element 进行比较吗?
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多