查找数组中元素周围的元素

2022-09-03 06:24:16

我有一个多维数组,我想获取该数组中特定元素周围的元素。

例如,如果我有以下情况:

[[1,2,3,4,5,6]
 [8,9,7,5,2,6]
 [1,6,8,7,5,8]
 [2,7,9,5,4,3]
 [9,6,7,5,2,1]
 [4,7,5,2,1,3]]

如何找到上述任何元素周围的所有8个元素?如何处理边缘的元素?

我想出的一种方法是,为此编写一个9行代码,这是显而易见的,但是有更好的解决方案吗?


答案 1

您可以在表单中使用“方向数组”

[[-1,-1], [-1,0],[1,0]..and so on]

采用点坐标并循环访问方向数组->坐标添加方向号,检查索引是否未越界并收集结果的方法。像这样:

private static int[][] directions = new int[][]{{-1,-1}, {-1,0}, {-1,1},  {0,1}, {1,1},  {1,0},  {1,-1},  {0, -1}};

static List<Integer> getSurroundings(int[][] matrix, int x, int y){
    List<Integer> res = new ArrayList<Integer>();
    for (int[] direction : directions) {
        int cx = x + direction[0];
        int cy = y + direction[1];
        if(cy >=0 && cy < matrix.length)
            if(cx >= 0 && cx < matrix[cy].length)
                res.add(matrix[cy][cx]);
    }
    return res;
}

答案 2

对于 (i, j) ->

              (i - 1, j - 1)
              (i - 1, j)
              (i - 1, j + 1)

              (i, j - 1)
              (i, j + 1)

              (i + 1, j - 1)
              (i + 1, j)
              (i + 1, j + 1)

现在,在边缘,您可以检查,然后在行边缘...和 ,然后是其列边缘。num % row == 0num % col == 0

以下是您可以继续的方法: -

给定一个索引 ..您可以在 与 for 相邻的行中找到元素,然后是 、然后是 。(注意: - 对于索引,您只需要访问 ,以及(i, j)ji - 1ii + 1ij - 1j + 1)

随后,您还可以检查 和 ..row edgecolumn edge

在这里,您可以查看下面的代码,它是如何发生的: -

    // Array size
    int row = 6;
    int col = 6;
    // Indices of concern
    int i = 4;
    int j = 5;

    // To the left of current Column
    int index = i - 1;
    for (int k = -1; k < 2; k++) {
        if (index % row > 0 && ((j + k)  % col) > 0) {
            System.out.println(arr[index][j + k]);
        }
    }


    // In the current Column
    index = i;

    // Increment is 2 as we don't want (i, j)
    for (int k = -1; k < 2; k = k + 2) {            
        if (index % row > 0 && ((j + k)  % col) > 0) {
            System.out.println(arr[index][j + k]);
        }
    }

    // To the right of current Column
    index = i + 1;
    for (int k = -1; k < 2; k++) {
        if (index % row > 0 && ((j + k)  % col) > 0) {
            System.out.println(arr[index][j + k]);
        }

    }

更新 : - 上述代码可以进一步简化。但是我把这个任务留给你。提示: - 你可以从那里减少一个 for 循环..