【问题标题】:Whether to use multidimensional array, or simple array with hashCodes是使用多维数组,还是使用 hashCodes 的简单数组
【发布时间】:2013-01-13 12:04:51
【问题描述】:

对于一个 Java 项目,我需要使用 5 种 ENUM 类型来索引一个 3 维双精度数组,它们为 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,但这似乎有点过头了。处理速度是这个项目的一个大问题,所以我试图避免迭代;强制运行时使用指针算法来获取正确的内存位置。

【问题讨论】:

  • 等等,你想完成什么?这里需要什么快速?您是在使用这个疯狂数组的所有元素还是稀疏数组?您会稍后对其进行迭代还是使用查找特定元素?

标签: java arrays multidimensional-array


【解决方案1】:

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

不过不知道有没有免费的Java R-tree实现。

编辑:有一个 - http://sourceforge.net/projects/jsi/

【讨论】:

  • 不太熟悉 R-trees。不确定我现在可以花时间学习它。 :)
  • MySQL 在数据库上提供 R-tree 索引。您可以在多个列上定义这样的索引并免费获得 R-tree。这可能对 OP 没有帮助,因为他希望它全部在内存中,但总的来说,这可能比尝试调试上面的内容要快。
  • @livefree75:如果库设计得很好,你不需要了解内部。它应该像 Java 集合一样工作。
  • 你知道的,一个Java R-tree数据结构:sourceforge.net/projects/jsi。另外看看这篇文章的其他建议:stackoverflow.com/questions/7435645/…
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2016-03-24
  • 2020-07-06
  • 2012-01-06
  • 2011-05-12
相关资源
最近更新 更多