是使用多维数组,还是使用hashCodes的简单数组

时间:2013-01-29 19:50:53

标签: java arrays multidimensional-array

对于Java项目,我需要使用5种ENUM类型来索引三维双精度数组,它为3D直线空间中的每个XYZ点定义一个特定属性。如此组织它会更好:

double[][][][][][][][] arr =
        new double[enum1Size][enum2Size][enum3Size][enum4Size][enum5Size]
                [maxX+1][maxY+1][maxZ+1];

arr[enum1][enum2][enum3][enum4][enum5][x][y][z] = theDouble;

或者通过使用一个简单的数组并使用包含每个枚举的对象的hashCode对其进行索引:

class EnumIndex {
    Enum1Type enum1;
    Enum2Type enum2;
    Enum3Type enum3;
    Enum4Type enum4;
    Enum5Type enum5;

    public EnumIndex(Enum1Type enum1, Enum2Type enum2,
            Enum3Type enum3, Enum4Type enum4, Enum5Type enum5)  {
        this.enum1 = enum1;
        this.enum2 = enum2;
        this.enum3 = enum3;
        this.enum4 = enum4;
        this.enum5 = enum5;
    }

    public int hashCode() {
         // Eclipse-generated hashcode function
    }

    public static int maxHashCode() {
         // generate maximum hashcode based on maximum ordinal of each enum
    }
}

double[][][][] arr = new double[EnumIndex.maxHashcode+1][maxX+1][maxY+1][maxZ+1];

EnumIndex ei1 = new EnumIndex(enum1, enum2, enum3, enum4, enum5);

double[ei1][x][y][z] = theDouble;
  • Enum1Type有15个值。
  • Enum2Type有4个值。
  • Enum3Type有4个值。
  • Enum4Type有2个值。
  • Enum5Type有2个值。

  • X的范围是0-9

  • Y的范围为0-5
  • Z的范围为0-22

因此,有大约1,324,800个双打被索引。

我打算使用EnumMaps的EnumMaps,但这似乎有些过分。处理速度是这个项目的一个大问题,所以我试图避免迭代;强制运行时使用指针算法来获取正确的内存位置。

1 个答案:

答案 0 :(得分:1)

如果速度是一个严重问题,我建议使用空间索引结构,如R树。特别是,如果要索引这么多元素。我怀疑自制索引不能解决你的问题。

但是,我不知道是否有免费的Java R-tree实现。

修改:有一个 - http://sourceforge.net/projects/jsi/