索引多维数组

Indexing multidimensional array

如果 arr1 是一个 int[][] 并且 arr2 是一个 int[2],是否有可能在 Java 中以某种方式像 arr1[arr2] 索引一个数组.

我想要一种更好的方法来实现与 arr1[arr2[0]][arr2[1]] 相同的效果,这看起来非常糟糕。更好的意思是更容易阅读和理解。

Is it possible in Java to index an Array somehow like arr1[arr2] if arr1 is an int[][] and arr2 an int[2]

如果 arr2int[],则

arr1[arr2] 无效。方括号之间唯一可以插入的是数字(或引用数字的变量)。 arr1[arr2[0]] 是有效的(假设两个数组中至少有 1 个元素)因为 arr2[0] 将是 int.

编辑

在我发布这个答案后,问题被更改为包括“编辑:我想达到与 arr1[arr2[0]][arr2[1]] 相同的效果”。

实现你所展示的方法,正是你所展示的,假设 arr1int[][]arr2int[]arr1第一维至少有1个元素,其值为至少有2个元素的数组

第二次编辑

你说“我想要一个更好的方法来实现 arr1[arr2[0]][arr2[1]]”。 “更好”是主观的。如果你想在更少的代码行方面做得更好,它不会变得更好,因为你有最少的代码行 (1)。如果你想让它更容易阅读,你可以这样做:

// of course, knowing the nature of the data
// would allow better variable names...
int firstElementInArr2 = arr2[0];
int secondElementInArr2 = arr2[1];
int[] outerArray = arr1[firstElementInArr2];
int result = outerArray[secondElementInArr2];

您可以做的另一件事是记住多维数组是数组的数组...

因此您可以执行以下操作:

int[][] arr = {{1,2,3},{4,5,6}};

int[] a = arr[1];
System.out.println(Arrays.toString(a));

版画

[4, 5, 6]


a[1] = 99;
System.out.println(Arrays.deeptoString(arr);

版画

[[1, 2, 3], [4, 99, 6]]

如果您有一个 矩形 已知尺寸 m×n 的二维数组,那么您可以使用 getValuesetValue 方法对其进行补充并使用 one 变量 position 访问其元素,范围从 1m×n.

Assignment, Arithmetic, and Unary Operators

  • / - 除法运算符
  • % - 余数运算符
public class Test {
    static int m = 3, n = 4;
    static int[][] array = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

    public static void main(String[] args) {
        System.out.println(getValue(5));     // 5
        System.out.println(setValue(5, 90)); // true
        System.out.println(getValue(5));     // 90
        System.out.println(Arrays.deepToString(array));
        // [[1, 2, 3, 4], [90, 6, 7, 8], [9, 10, 11, 12]]
    }

    public static int getValue(int pos) {
        if (pos >= 1 && pos <= m * n) {
            int i = (pos - 1) / m; // row
            int j = (pos - 1) % n; // column
            return array[i][j];
        } else {
            return 0;
        }
    }

    public static boolean setValue(int pos, int value) {
        if (pos >= 1 && pos <= m * n) {
            int i = (pos - 1) / m; // row
            int j = (pos - 1) % n; // column
            array[i][j] = value;
            return true;
        } else {
            return false;
        }
    }
}

另请参阅: