0

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

(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 
4

3 回答 3

2

AInteger不能代表坐标。您可以创建类似的东西 -

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);
    }
于 2012-10-19T03:51:09.803 回答
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值,对吗?

于 2012-10-19T03:50:12.120 回答
1

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

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

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

此外,请学习和使用 Java 命名约定,包括:

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

仅当您希望其他人(例如您的讲师或我们)更轻松、更快速地理解您的代码时,这一点才重要。

于 2012-10-19T03:50:21.983 回答