用Java计算曼哈顿距离

时间:2012-10-19 03:42:31

标签: java distance proximity

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

(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 

3 个答案:

答案 0 :(得分:2)

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);
    }

答案 1 :(得分:1)

您正在计算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值的整数,是吗?

答案 2 :(得分:1)

我认为你需要重构一些事情来简化。首先,创建一个简单的manhattanDist方法,该方法接受两个Point对象并返回一个int:

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

然后,在比较ArrayList<Point>时,您可以轻松地使用此方法,而不会像上面那样混淆for循环中的内容。

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

  • 方法名称应以小写字母开头
  • 类名应以大写字母开头。
  • 标识符名称应该是合乎逻辑的,应该是有意义的,并且应该使您的代码自我评论。

如果您希望其他人(例如您的教师或 我们 )更轻松快速地了解您的代码,这一点非常重要。