【问题标题】:Different kind of multi-dimensional arrays in Java?Java中不同类型的多维数组?
【发布时间】:2021-02-15 02:38:53
【问题描述】:

我正在使用 Java 11(+ IntelliJ IDE)。我的代码通过 JNI 从 3d 方 C++ 库中检索多维数组。

我的代码如下所示:

Object[][][] param1 = {{{"somevalue"}}};
Object[] param2 = param1
Object[][][] param3 = (Object[][][])param2; //OK
Object[][][] result1 = SomeNativeLibrary.someNativeCall(param1);
Object someResult = result1[0][0][4]; //OK
Object[] result2 = result1;
Object[][][] result3 = (Object[][][])result2;  //CastException

通过我的调试器我可以清楚的看到param1和result1的结构不同(虽然都假设为3维数组):

对于参数 1:{Object[1][][]} -> {Object[1][]} -> {Object{1}}
结果1:{Object[1]} -> {Object[1]} -> {Object[4]}

尽管从 param2 转换为 param3 没有问题,但从 result2 转换为 result3 失败

 "java.lang.CastException: class [Ljava.lang.Object; cannot be case to class [[[Ljava.lang.Object" (notice the single square-bracket versus triple square-bracket before the "L").

我面临的问题是我通过一些远程处理框架返回了 result1。所以我最终(在远程处理的客户端/调用端)得到了一个像上面 result2 一样的一维数组。

1)如何将 result2 转换回 Object[][][] 数组,以便更方便地访问数据?
2)为什么从 param2 转换为 param3 工作,而不是 result2 到 result3?

【问题讨论】:

  • 您将需要使用 for 循环来完成它,没有办法只从 1-dim 数组转换为 2-dim 数组 AFAIK。不过,如果您四处寻找,Java 标准库中的某处可能有一个实用程序方法。
  • 请正确格式化您的代码。在发布问题之前阅读 SO 说明。
  • Java 中没有多维数组。只是包含其他对象的数组。这样的对象可能又是一个数组,它又包含对象。
  • Java 中的 Multi dim 数组是一个引用数组,在 C++ 中它就像一个索引为 [i+nj] 的单个数组,其中 n 是数组的宽度。我的猜测是使用单个数组,获取 n,然后在其上循环以复制到数组数组,或者包装在一个对象中以计算索引 [i+jn]
  • 所以您不会在Object[][][] result1 = SomeNativeLibrary.someNativeCall(param1); 行收到错误消息? someNativeCall的签名是什么?

标签: java multidimensional-array java-native-interface


【解决方案1】:

查看SomeNativeLibrary.someNativeCall(param1) 的文档,并检查它实际返回的内容。 CastException 表明它在类文件中被声明为对象的一维数组,因此您需要这样对待它。

如果它原本是一个多维C++数组,那么它很可能在Java中表示为一个一维数组,元素(x,y,z)在索引x*Y*Z + y*Z + z处,其中Y是数组的维数在 y 方向上,Z 在 z 方向上的尺寸。但是请检查文档以确保并以这种方式使用它。

Java 中的多维数组不是这样构造的,而是作为指向其他数组的指针的一维数组。所以不能直接将其转换为多维 Java 数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多