【问题标题】:Iteratation through variables of an objects (java)迭代对象的变量(java)
【发布时间】:2016-08-17 04:19:47
【问题描述】:

我有一个类Room,其构造函数如下:

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

在另一个class我想用欧几里得距离计算两个房间的相似度。因此,我想通过iterateobject 房间将房间1 的第一个值(x)与房间2 的第一个值(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);    

【问题讨论】:

  • 为什么不使用 3D 点类?

标签: java loops object iterator euclidean-distance


【解决方案1】:

你用一种非常复杂的方式来做这件事,不需要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

【讨论】:

  • 所以只能通过 getter 获取值?不是像 room.nextValue() 这样的东西,所以你可以在一行代码中编写整个部分:double value = Math.pow(r[i].nextValue() - r[i+1].nextValue( ), 2); ?
  • 我不知道如何使用Iterator 来准确地完成您的数据表示。如果将这些数据存储为例如ArrayList,您可以更轻松地循环它们或使用Stream,这也需要一行。
【解决方案2】:

你不能像那样迭代字段。您可以使用反射来迭代字段,但不要。

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

它实际上比您尝试做的代码更少

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2016-08-27
    • 2018-07-18
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多