2016-04-23 52 views
1

我有一個class間下面的構造:Iteratation通過一個對象(JAVA)的變量

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

在另一個class我想要通過使用歐氏距離來計算兩個房間的相似性。因此,我想iterate通過object房間來比較room1的第一個值(x)與room2的第一個值(x),第二個(y)與第二個(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是不需要的。

如果你想得到歐幾里得距離,你只需要解析這兩個要比較的實例Room。我假設你的Room類有getters。

根據給定的所有實例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

所以只能通過getters獲取值?是不是很像room.nextValue(),所以你可以在一行代碼中寫出整個部分: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)快得多。

它實際上甚至是減去代碼比你想要做的。