【问题标题】:Calculating Manhattan distance in Java用Java计算曼哈顿距离
【发布时间】:2012-10-19 03:42:31
【问题描述】:

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

(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 

【问题讨论】:

    标签: java distance proximity


    【解决方案1】:

    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】:

      您正在计算 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 值,对吗?

      【讨论】:

      • @GregHewgill 哦,好的,我会从我的回答中删除它。
      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        相关资源
        最近更新 更多