2016-04-23 5 views
1

私は、次のコンストラクタを持つclassルームがあります。私は、ユークリッド距離を使用して、2つの部屋の類似度を計算する別のclassIteratation(Java)の

public Room (int x, int y, int z, int Stockwerk) {  
    this.x = x; 
    this.y = y; 
    this.z = z; 
    this.Stockwerk = Stockwerk; 
} 

を。したがって、iterateトラフobject room1の最初の値(x)とroom2の最初の値(x)、2番目の値(y)と2番目の値(y)などを比較します。 (私はどのように結果を得ようとしたのかを以下のコードで説明しています)。オブジェクトルームを反復処理するオプションはありますか?

Iterator itrRoom1 = room1.iterator(); 
    Iterator itrRoom2 = room2.iterator(); 

    while (itrRoom1.hasNext()) {    
     while (itrRoom2.hasNext()) { 
      int value1 = itrRoom1.next(); 
      int value2 = itrRoom2.next(); 
     } 
     //this is the function how I get the similarity of two rooms (euclidean distance) 
     squareSubtraction = squareSubtraction + Math.pow(Math.abs(value1 - value2)), 2); 
    } 

    distance = Math.sqrt(squareSubtraction); 
+0

なぜ3Dポイントクラスを使用しないのですか? – Markus

答えて

2

これは非常に複雑な方法で行います。Iteratorは不要です。

ユークリッド距離を取得する場合は、比較する2つのインスタンスRoomを解析するだけで済みます。あなたのRoomクラスにゲッターがあると仮定します。

Roomのすべてのインスタンスのループスルーに基づいて、任意の数の引数で次の方法を使用できます。

public static void main(String[] args) { 
    Room room1 = new Room(10,12,2,0); 
    Room room2 = new Room(4,8,2,0); 
    Room room3 = new Room(7,5,2,0); 
    Room room4 = new Room(10,2,2,0); 

    double result = similarity(room1, room2, room3, room4); 
} 

public static double similarity(Room ... r) { 
    double sum = 0; 
    for (int i=0; i<r.length-1; i++) { 
     double a = Math.pow(r[i].getX() - r[i+1].getX(), 2); 
     double b = Math.pow(r[i].getY() - r[i+1].getY(), 2); 
     sum += a + b; 
    } 
    return Math.sqrt(sum); 
} 

これは、あなたの結果与えている:あなたはフィールドようなを反復することはできません

9.38083151964686

+0

ゲッター上で値を取得することは可能ですか? room.nextValue()のようなものではないので、全体の部分を1行のコードで書くことができます:double value = Math.pow(r [i] .nextValue() - r [i + 1] .nextValue( )、2); ? – Julian

+0

データ表現を行うために 'Iterator'を使う方法がわかりません。これらのデータを例えば 'ArrayList'のように保存しておくと、それらを簡単にループすることができますし、' Stream'を使うこともできます。 –

1

を。リフレクションを使用してフィールドを反復することはできますが、そうしないでください。

あなたは3つの値しかありません。ちょうどそれらを使用します。

long dx = room1.getX() - room2.getX(); 
long dy = room1.getY() - room2.getY(); 
long dz = room1.getZ() - room2.getZ(); 
double distance = Math.sqrt(dx * dx + dy * dy + dz * dz); 

dxなどがlong宣言し、そうdx * dxはオーバーフローしません、とdx * dxMath.pow(dx, 2)よりもはるかに高速であることをされています。

実際にはコードがであり、やっていたものよりも小さくなっています。

関連する問題