计算Java的曼哈顿距离



我正在创建一个简单的程序来计算从文本文件中读取的坐标的接近距离度量,我想创建方法来计算给定点的曼哈顿距离,例如:

(0,1,1,0,1), (1,0,0,0,1), (0,0,0,1,1)
would result in:
      Item1 Item2 Item3
Item1  0    3     3
Item2  3    0     2
Item3  3    2     0

曼哈顿方法:

public static void Manhattan(ArrayList<Points> x) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        int distance = 0;
        for(int ii=0;ii<x.size();ii++) {
            for(int jj=0; jj<x.get(ii).coordinates.size();jj++) {
                 distance = Math.abs(x.get(ii).coordinates.get(jj)) + Math.abs(x.get(ii).coordinates.get(jj));
            }   
            result.add(distance);
        }
        for(int ii=0;ii<result.size();ii++) {
            for(int jj=0; jj<result.size();jj++) {
                System.out.print(result.get(ii));
            }
            System.out.print(" ");
        }
    }

班级点:

import java.util.ArrayList;
public class Points {
    ArrayList<Integer> coordinates = new ArrayList<Integer>();
    public Points (ArrayList<Integer> coordinates) {
        this.coordinates = coordinates;
    }
    public ArrayList<Integer> getCoordinates() {
        return coordinates;
    }
    public void setCoordinates(ArrayList<Integer> coordinates) {
        this.coordinates = coordinates;
    }
}

问题是我运行该方法时会得到奇怪的结果,任何人都知道有什么问题?

result: 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 222222222222222 

Integer不能表示坐标。您可以创建类似 -

之类的东西
public class Coordinate {
    private int x;
    private int y;
    //...getter/setter/constructor ...
}

可以代表坐标。

而不是(仅仅是整数列表)

ArrayList<Integer> coordinates = new ArrayList<Integer>();

使用(坐标列表)

List<Coordinate> coordinates = new ArrayList<Coordinate>();

现在,如果您将方法定义为@hovercraft建议的方法(对于Coordinate),那么可以很容易地计算所有点与所有其他点(包括本身)

之间的距离
for(int i=0; i<coordinates.size(); i++) {
    for(int i=0; i<coordinates.size(); i++) {
        System.out.println(manhattnDist(coordinates.get(i), coordinates.get(j)));
    }
}

您的代码中一个明显的问题

    int distance = 0;
    for(int ii=0;ii<x.size();ii++) {
        for(int jj=0; jj<x.get(ii).coordinates.size();jj++) {
             //you keep assigning new values 
             distance = Math.abs(x.get(ii).coordinates.get(jj)) + Math.abs(x.get(ii).coordinates.get(jj));
        }   
        //and then you add
        result.add(distance);
    }

您正在计算2分之间的距离,但不能在任何地方保存结果:

for(int jj=0; jj<x.get(ii).coordinates.size();jj++) {
    distance = Math.abs(x.get(ii).coordinates.get(jj)) +
               Math.abs(x.get(ii).coordinates.get(jj));
    //what happens with distance?
}
//you get only the last distance between the last points.
result.add(distance);

另外一件事,您的distance变量是一个可以容纳double值的整数,是对吗?

您认为您需要进行重构事情来简化。首先,创建一种简单的曼哈顿主义方法,该方法接受两个点对象并返回一个INT:

public int manhattanDist(Point p1, Point p2) {
  // calc the manhattan distance and return it
}

然后,在比较 ArrayList<Point>时,您可以轻松地使用此方法,而无需在上面的情况下混合循环中的事物。

另外,请学习并使用Java命名约定,包括:

  • 方法名称应从较低的案例字母开始
  • 班级名称应从上限字母开始。
  • 标识符名称应该是合乎逻辑的,应该有意义,并且应该使您的代码自我征服。

这仅在您想要其他人(例如您的教师,或 us )的情况下更容易,快速地理解您的代码。

相关内容

  • 没有找到相关文章

最新更新