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 が提案したようにメソッドを定義すると (for に対して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)));
    }
}

コードの明らかな問題の 1 つ

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

もう1つ、distance変数は値を保持しようとする整数doubleですよね?

于 2012-10-19T03:50:12.120 に答える
1

単純化するには、物事をリファクタリングする必要があると思います。まず、2 つの Point オブジェクトを受け取り、int を返す単純な manhattanDist メソッドを作成します。

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

ArrayList<Point>次に、上記のように for ループで混同することなく、比較するときにこの方法を簡単に使用できます。

また、次のような Java 命名規則を学び、使用してください。

  • メソッド名は小文字で始める必要があります
  • クラス名は大文字で始める必要があります。
  • 識別子の名前は論理的で意味があり、コードに自己コメントを付ける必要があります。

これは、他の人 (インストラクターや私たちなど) にコードをより簡単かつ迅速に理解してもらいたい場合にのみ重要です。

于 2012-10-19T03:50:21.983 に答える