java - 如何像存储在二维数组中一样访问数组中的数据?

标签 java arrays reference

在 Java 中,我的数据有时需要作为一维数组进行访问,有时需要作为二维数组进行访问。换句话说,我希望能够将相同的数据映射为普通数组和二维数组。

由于Java中的二维数组实际上是数组的数组,因此我希望数组数组中的元素引用一维数组中的元素。

类似于:

int  height = 5;
int  width  = 10;
int  length = height * width;

int[]   oneD = new int[length];
int[][] twoD = new int[height][];

int i, j;
for (i = j = 0 ; i < height ; ++i, j += width)
{
    // Following Statement fails to compile.
    twoD[i] = oneD[j];  // assign reference, not value
}

问题是语句“twoD[i] = oneD[j]”由于类型不匹配而失败。语句“twoD[i][0] = oneD[j]”失败,因为twoD[i] 为空。 “twoD[i][] = oneD[j]”也无法编译。

在 C++ 中,这是一个简单的问题,您可以将数组数组创建为指针数组,然后将指针数组的每个元素设置为一维数组中元素的地址。

我的问题是:

  1. 有没有办法将数组的数组映射到二维数组中,使得每个数组都是一维数组的一部分?换句话说,您可以访问数组中元素的引用并将其分配给数组元素的数组吗?

  2. 是否可以在 Java 中执行此操作,而无需编写封装数据并为数据提供一维和二维索引的类?

  3. 或者,是否有更好的方法使用容器类而不是数组来完成等效的事情?

因素:

  • 使用 Java 8

  • 我不关心二维数组是否可以为每个数组(列)提供正确的长度。

最佳答案

  1. 没有。在 Java 中,无法对数组的中间进行“引用”。唯一的访问是通过正常索引。

  2. 您不需要编写类:容器类就可以做到这一点。

  3. 是的。如果您创建了一个ArrayList,那么您可以使用List.subList 返回对原始列表的一部分的引用。这里唯一的技巧是,在获取子列表之前,列表中需要实际包含元素。

所以类似:

List<Integer> list = IntStream.range(0, 50).boxed().collect(toList());
List<List<Integer>> sublists = IntStream.range(0, 5)
    .mapToObj(i -> list.subList(i * 10, (i + 1) * 10)).collect(toList());

System.out.println(subLists.get(2));

打印出 [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

关于java - 如何像存储在二维数组中一样访问数组中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49480846/

相关文章:

java - 解析 XML 时出错 : unbound prefix (External library)

java - 字符串到数组字符串的精确副本! DPLL算法

javascript - 在 array.indexOf(x) 中搜索总是返回 -1 即使该值存在

c - 查找 C 语言中最长的单词

visual-studio-2010 - 在大型 VS 解决方案中自动添加引用

java - 一致的 Equals() 结果,但不一致的 TreeMap.containsKey() 结果

Java : Quartz scheduler - is there a way I can get next five runs of a scheduled job

arrays - 将 postgres 中的一组数组展平为单个数组

c++ - 有没有办法在 C++ 中预先声明嵌套类?

java - 遍历深层数据结构并删除对象