遍历对象的变量 (java)
Iteratation through variables of an objects (java)
我有一个 class Room
具有以下构造函数:
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
房间比较房间 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);
你做的很复杂,Iterator
不需要。
如果想得到欧氏距离,只需要解析这两个Room
实例进行比较即可。我假设你的 Room
class 有吸气剂。
您可以根据给定的 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 * dx
比 Math.pow(dx, 2)
快得多。
它实际上 代码 比您尝试做的还要少。
我有一个 class Room
具有以下构造函数:
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
房间比较房间 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);
你做的很复杂,Iterator
不需要。
如果想得到欧氏距离,只需要解析这两个Room
实例进行比较即可。我假设你的 Room
class 有吸气剂。
您可以根据给定的 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 * dx
比 Math.pow(dx, 2)
快得多。
它实际上 代码 比您尝试做的还要少。