如何比较嵌套for循环中的(列表的)坐标点

时间:2016-07-27 01:41:50

标签: java

在构建一个equals方法时遇到一些麻烦,该方法根据包含零点(0,0) - 方程的距离来比较列表中的二维坐标点。

    public double distanceToOrigin() {
        return distance(zero);
    }

    public double distance(Point that) {
       return Math.sqrt(Math.pow((x - that.getX()), 2) + Math.pow((y - that.getY()), 2));
    }

    boolean equals(List<Point> lst){
        boolean eq = true;      
        for (int i=0; i<lst.size(); i++)//accounts for first element-to-compare. 
        {

        for (int q = 1; q < lst.size(); q++)//accounts for second element-to-compare.
        {

                if(lst.distanceToOrigin(i) == (lst).distanceToOrigin(q)))
                {
                   eq = false;
                }
            }
        }
        return eq;
    }

我可能过度解释if语句:是否有更有效的方法来比较两个元素(在一行代码中)?

供参考:

static Point zero = new Point(0, 0);

public int getX(){
        return x;
}
public int getY(){
    return y;
}

衷心感谢。

2 个答案:

答案 0 :(得分:0)

列表示例:

List<Point> lst = new ArrayList<Point>();

更正的等于方法看起来类似于以下(当前有点笨拙的实施):

boolean equals(List<Point> lst){
    boolean eq = true;      
    for (int i=0; i<lst.size(); i++)//accounts for first element-to-compare. 
    {

        for (int q = 1; q < lst.size(); q++)//accounts for second element-to-compare.
        {

            if(lst.get(i).distanceToOrigin() == lst.get(q).distanceToOrigin()){
                eq = false;
            }
        }
    }
    return eq;
}

equals方法应该根据element-to-compare(1)是否与element-to-compare(2)相同来返回boolean true或false。

答案 1 :(得分:-1)

如果你正在寻找两个点的相等距离​​,你可能最好只比较坐标的平方和。这避免了比较浮点数并且效率更高:

class Point {
    public boolean isSameDistanceFromOrigin(Point other) {
        return x * x + y * y == other.x * other.x + other.y * other.y;
    }
}

如果我正确地解释你的循环,你想要返回false,如果列表中的任何两个点与原点的距离相同。这是使用Java 8在一行(某种程度)中执行此操作的算法:

public boolean areAllDifferentDistancesFromOrigin(List<Point> points) {
    return points.stream().noneMatch(point -> 
        points.stream().filter(p -> p != point)
            .anyMatch(p-> point.isSameDistanceFromOrigin(p)));
}