用Java计算曼哈顿距离

用Java计算曼哈顿距离,java,distance,proximity,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<Poi

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

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

    }

您正在计算两点之间的距离,但未将结果保存到任何位置:

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

for(int jj=0;jj您正在计算两点之间的距离,但不将结果保存在任何位置:

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

for(int jj=0;jj我认为您需要重构东西来简化。首先,创建一个简单的manhattanDist方法,该方法接受两个点对象并返回一个int:

public int manhattanDist(Point p1, Point p2) {
  // calc the manhattan distance and return it
}
然后,在比较
ArrayList
时,您可以轻松地使用此方法,而不会像上面所做的那样在for循环中混淆内容

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

  • 方法名称应以小写字母开头
  • 类名应以大写字母开头
  • 标识符名称应该是逻辑的、有意义的,并且应该使代码具有自注释性

只有当你想让其他人(如你的导师或我们)更容易、更快速地理解你的代码时,这一点才很重要。

我认为你需要重构东西来简化。首先,创建一个简单的ManhattandList方法,该方法接受两点对象并返回int:

public int manhattanDist(Point p1, Point p2) {
  // calc the manhattan distance and return it
}
然后,在比较
ArrayList
时,您可以轻松地使用此方法,而不会像上面所做的那样在for循环中混淆内容

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

  • 方法名称应以小写字母开头
  • 类名应以大写字母开头
  • 标识符名称应该是逻辑的、有意义的,并且应该使代码具有自注释性

只有当您希望其他人(如您的讲师或我们)更容易、更快速地理解您的代码时,这一点才很重要。

整数不能表示坐标。您可以创建如下内容-

public class Coordinate {
    private int x;
    private int y;

    //...getter/setter/constructor ...
}
它可以表示一个坐标

而不是(仅包含整数的列表)


代码中有一个明显的问题

    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);
    }
int距离=0;

for(int ii=0;iiA
Integer
不能表示坐标。您可以创建如下内容-

public class Coordinate {
    private int x;
    private int y;

    //...getter/setter/constructor ...
}
它可以表示一个坐标

而不是(仅包含整数的列表)


代码中有一个明显的问题

    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);
    }
int距离=0;

对于(int ii=0;ii@GregHewgill哦,好的,我将从我的答案中删除它。@GregHewgill哦,好的,我将从我的答案中删除它。
    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);
    }