簡體   English   中英

通過對象的變量進行迭代(java)

[英]Iteratation through variables of an objects (java)

我有一個帶有以下構造函數的類Room

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

在另一個class我想通過使用歐幾里德距離來計算兩個房間的相似度。 因此,我想通過objectiterate ,將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);    

你以一種非常復雜的方式完成它,並且不需要Iterator

如果你想獲得歐幾里德距離,你只需要解析這兩個要比較的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

你不能迭代這樣的字段 您可以使用反射迭代字段,但不能。

您只有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)快得多。

它實際上甚至比您嘗試的代碼更少

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM