0

我有一个类,其中包含多种类型的变量,其中大多数(大约 30 个)是双重的:

String something;
double x;
double y;
double z;
...

我想迭代双打,但也要让它们以这种“经典方式”而不是在数组中编写,因为派生类使用它们中的大部分。我现在遇到的问题是如何遍历所有双精度类型变量,找出其中有多少是非零的,然后随机选择所有这些变量中的一个。这个类会有数千个实例,正如我所说,有一些类可以扩展这个类。所以我正在研究解决方案,最好是伪类:

nonzeros = 0
foreach doubleVarInClass variable
{
    if (variable != 0)
    nonzeros++;
}
if (nonzeros < parameter)
{
    randomDoubleVarInClass = random.next(...);
}

我正在考虑的一种解决方案是使用 HashMap 来保留所有变量,但是我将不得不重写所有使用这个的类并且不确定它会如何影响性能,因为它会一直被大量使用. 我应该害怕性能并尝试使用经典数组吗?如果没有的话,我想至少保留变量名。我想到了引用这些变量的数组,所以我可以这样写,由于Java中的值传递,不确定它是否可能。

也可能有一些结构可以保留有关其中有多少是非零或具有有效功能的信息?

感谢您提供任何可以解决我的问题的信息:)

4

1 回答 1

1

我建议为此使用反射。假设您有一个名为的类的实例o

int nonzeros = 0;
for (Field f : o.getClass().getDeclaredFields()) {
  f.setAccessible(true);
  if (f.getType().equals(Double.TYPE) && f.getDouble(o) != 0.0) {
    nonzeros++;
  }
}

注意:从性能的角度来看,Java 反射可能不是一个好主意,从这个角度来看,您应该首先测试它。除此之外,这提供了简单的检查,而无需对您的类定义进行任何更改。在 Java 6 中,反射的性能略好于旧版本,您应该在您的个人用例和您的环境中检查这一点。

于 2013-02-24T19:40:08.453 回答