2016-04-23 29 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)快得多。

它实际上甚至是减去代码比你想要做的。

相关问题