在数组中存储坐标并在java中比较它们的最佳方法?

时间:2014-02-21 15:15:18

标签: java arrays list sorting double

请求java帮助

我是编程的1.5周,所以试着为一个idoit轻松回答。这个答案可能就在那里,我可能会愚蠢地意识到我已经读过它了。

所以我有一堆对象实例,我想添加

的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; } 这不起作用..(我认为)

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

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

2 个答案:

答案 0 :(得分:6)

这里有几个问题。首先,将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身份值(==)是合适的。但这是否确实存在问题取决于您的应用案例。

答案 1 :(得分:1)

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