Java:将数组元素映射到一组属性

时间:2015-05-21 13:49:52

标签: java multidimensional-array hashmap

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

我将这些属性设计为Class:

public class ElemProperties 
{
    public double prop1;

    ...     
}

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

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

使用它,例如:

elemProperties.get(exampleArray).getProp1();

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

3 个答案:

答案 0 :(得分:2)

首次尝试将是:

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作为地图的键是一个问题,另一个是发生自动装箱转换并且可以添加一些内存和运行时间开销。所有这些问题都可以通过仔细编码来克服,但我只是在这里展示了基本概念。)

答案 1 :(得分:2)

  

因为HashMap比较引用是否有效。

比较引用也恰好是这种方法的最大问题:对象是double的二维数组并不重要 - 人们可以简单地用

替换你的地图
HashMap<Object,ElemProperties> elemProperties;

不会失去任何功能。

更好的方法是根据double

的数组创建一个表示2D键的类
class KeyDouble2D {
    private final double[][] key;
    public KeyDouble2D(double[][] key) {
        // Make a copy of key into this.key
    }
    public boolean equals(Object other) {
        // Ensure that other is KeyDouble2D, then compare key
        // sizes, and finally compare arrays element-by-element.
        // Make sure to use `Double.equals` method to avoid NaN != NaN problem.
    }
    public int hashCode() {
        // Compute hash code as a sum of hash codes in 2D array
    }
}

您可以将此类用于哈希映射的键:

HashMap<KeyDouble2D,ElemProperties> elemProperties = ...;
...
ElemProperties prop = elemProperties.get(new KeyDouble2D(exampleArray)).getProp1();

请注意,在将double数组用于散列键时需要非常小心,原因与比较double时为什么需要小心相同。

答案 2 :(得分:2)

为什么不创建一个类DoubleWithProperties,并操纵这个类的数组,而不是使用hashmap?

class DoubleWithProperties {
   double value;
   ElemProperties props;
   public DoubleWithProperties(double value, ElemProperties props){
   ...
   }
}
DoubleWithProperties[][] array = new DoubleWithProperties[5][5];