0

Java プロジェクトの場合、double の 3 次元配列にインデックスを付けるために使用する必要がある 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 の double のインデックスが作成されます。

EnumMaps の EnumMaps を使用するつもりでしたが、それはやり過ぎのようでした。このプロジェクトでは処理速度が大きな問題になるため、繰り返しを避けようとしています。ランタイムがポインタ演算を使用して正しいメモリ位置を取得するように強制します。

4

1 に答える 1

1

速度が深刻な問題である場合は、Rツリーなどの空間インデックス構造を使用することをお勧めします。特に、非常に多くの要素にインデックスを付けたい場合。自作のインデックスでは問題が解決しないのではないかと思います。

ただし、無料のJavaRツリー実装があるかどうかはわかりません。

編集: 1つあります-http: //sourceforge.net/projects/jsi/

于 2013-01-29T19:55:30.547 に答える