我有多维double[][]数组,其中每个元素都有一组属性。

我将这些属性设计为一个类:

public class ElemProperties
{
    public double prop1;

    ...
}


使用HashMap将它们与数组的元素链接:

HashMap<double[][], ElemProperties> elemProperties;


像这样使用它:

elemProperties.get(exampleArray).getProp1();


但是,这仅用作整个数组和属性之间的映射。我想做的是实际映射元素。由于Java没有指针,因此我有点被卡在了这个位置。这种设计似乎很复杂,是否有更好的方法来实现这一目标?

最佳答案

第一次尝试是:

public class Elem {
    private double value;
    private double additionalProperty1;
    private double additionalProperty2;
    ...
}


并创建一个Elem[][]而不是double[][]

这至少可以工作,但是多维数组也不太有效,也不太能表达,因此下一个问题是,是否可以使用其他结构对它们进行分组。

如果其他属性是可选的,或者可以在多个元素之间共享,那么您也需要为其编写对象,但是起点是相同的。



当然,由于“原因”,您确实有可能确实需要Map将值链接到其他属性。在这种情况下,您可以执行以下操作:

public class Container {
   private double[][] values;
   private Map<Double,AdditionalProperties> properties;

   public double getValue(int x, int y) {
     return values[x][y];
   }

   public AdditionalProperties getProperties(int x, int y) {
     return properties.get( getValue(x, y ) );
   }
 }


这样,您可以隐藏使用两个单独的数据结构存储数据并维护它们之间的数据完整性的事实。

请注意,尽管这在语义上与第一个解决方案有很大不同。特别是,包含相同值的头寸将共享其AdditionalProperties

(此实现还存在一些实际问题,@ dasblinkenlight已经指出了为什么将double用作映射的键​​是一个问题,另一个是发生自动装箱转换,这可能会增加一些内存和运行时开销。所有这些问题可以通过仔细的编码来克服,但是我仅在此处演示基本概念。)

09-05 11:52
查看更多