从二维数组中删除一列

Remove a Column from a 2D Array

我对从二维数组中删除 col 没有什么问题。

目标是从每一行中删除特定索引 "2" 并将其返回。

Its how it need to be

我做到了,但最后 0 没遇到什么问题。

Its how I got

private static void removeEntry(int[][] workArray, int col) {
    int row = workArray.length;
    //largest row count
    int max = 0;
    int tempNum = 0;
    for (int[] ints : workArray) {
        tempNum = 0;
        for (int j = 0; j < ints.length; j++) {
            tempNum++;
            if (tempNum > max) {
                max = tempNum;
            }
        }
    }
    int [][] newArray = new int[row][max];
    for(int i = 0; i < row; i++) {
        for(int j = 0; j < max; j++) {
            if(j < col && j < workArray[i].length) {
                newArray[i][j] = workArray[i][j];
            }else if (j == col) {
                // Do nothing
            } else if (j > col && j < workArray[i].length) {
                newArray[i][j - 1] = workArray[i][j];
            }
        }
    }
    for (int i = 0; i < workArray.length; i++) {
        for (int j = 0; j < workArray[i].length; j++) {
            workArray[i][j] = newArray[i][j];
        }
    }
    

然后我尝试删除 0 但没有成功

int remIndex = 0;
    for (int i = 0; i < workArray.length; i++) {
        for (int j = remIndex; j < workArray[i].length-1; j++) {
            if(workArray[i][j] == remIndex){
                workArray[i][j] = workArray[i][j + 1];
            }
        }
    }

这是我对此的处理方法。我使用 System.arraycopy() 将数组复制到删除的列,并从删除的列之后直接复制到最后。这样,我们就从数组中完全删除了该列。

private static int[][] removeEntry(int[][] workArray, int col) {
        int[][] resultArray = new int[workArray.length][];
        int index = 0;
        for (int[] row : workArray) {
            if (row.length - 1 < col) {
                resultArray[index] = row;
                index++;
                continue;
            }

            int[] arrayCopy = new int[row.length - 1];
            System.arraycopy(row, 0, arrayCopy, 0, col);
            System.arraycopy(row, col + 1, arrayCopy, col, row.length - col - 1);

            resultArray[index] = arrayCopy;
            index++;
        }

        return resultArray;
    }

一个数组是一个数据容器,它占用一个连续的内存块,它的大小应该在数组被实例化时定义并且不能改变。

如果您需要一个更小或更大长度的数组,那么您需要创建一个新数组并复制所有应该保留的先前添加的元素。

Java中也没有“2D”数组这样的东西,我们可以创建一个嵌套数组,即包含其他数组的数组。

类似于我们如何在普通数组 int[] 的特定索引处重新分配整数值,我们可以更改数组数组中的 reference,即我们可以让它指向另一个(新创建的)数组。

由于方法是 void,这就是您作业中需要做的事情。 IE。 给定的数组需要通过替换其所有“行”来更改,长度大于或等于要删除的给定col,一个新数组将保留除索引 col.

之外的所有先前元素
private static void removeEntry(int[][] workArray, int col) {
    
    for (int row = 0; row < workArray.length; row++) {
        
        if (workArray[row].length <= col) { // no need to change anything
            continue;
        }
        
        int newLength = workArray[row].length - 1;
        int[] newRow = new int[newLength]; // creating a new row shorter by 1
        
        for (int oldCol = 0, newCol = 0; oldCol < workArray[row].length; oldCol++, newCol++) {
            if (oldCol == col) { // skipping the target column
                newCol--;        // newCol would be incremented automatically at the end of the iteration, but we want it to remain the same
                continue;
            }
            newRow[newCol] = workArray[row][oldCol];
        }
        
        workArray[row] = newRow; // reassigning the row
    }
}

main()

public static void main(String[] args) {
    int[][] testArr =
            {{1, 2},
            {1, 2, 3},
            {1, 2, 3, 4}};

    removeEntry(testArr, 2);

    // printing the testArr
    for (int[] arr: testArr) {
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[1, 2]
[1, 2]
[1, 2, 4]

A link to the Online Demo

如果您错误地将方法设为 void,则需要 return 一个新数组,即 return 类型 int[] (仔细检查你的作业要求)。然后需要对上面解释和实现的逻辑应用一个小的更改:每个数组都应该用一个新数组替换,然后放入新创建的结果数组中。

注意Arrays.copyOf()允许创建孔数组的副本,System.arraycopy()可以帮助您将给定范围内的元素从一个数组复制到另一个数组,但是因为您正在处理一个我建议你用循环手动完成它,因为你需要展示如何使用数组进行操作的知识,而不是特殊实用功能的知识(除非另有说明在作业中指定).

private static int[][] removeEntry(int[][] workArray, int col) {
    int[][] result = new int[workArray.length][];

    for (int row = 0; row < workArray.length; row++) {

        int newLength = col < workArray[row].length ? workArray[row].length - 1 : workArray[row].length;
        int[] newRow = new int[newLength];

        for (int oldCol = 0, newCol = 0; oldCol < workArray[row].length; oldCol++, newCol++) {
            if (oldCol == col) {
                newCol--;
                continue;
            }
            newRow[newCol] = workArray[row][oldCol];
        }

        result[row] = newRow; // reassigning the row
    }
    
    return result;
}

main()

public static void main(String[] args) {
    int[][] testArr =
            {{1, 2},
            {1, 2, 3},
            {1, 2, 3, 4}};

    int[][] newArr = removeEntry(testArr, 2);

    // printing the testArr
    for (int[] arr: newArr) {
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[1, 2]
[1, 2]
[1, 2, 4]

A link to the Online Demo

数组是固定大小的。在初始化数组时,其中存储了一个默认值。这里,默认存储 0。所以我建议你不要将“col”初始化为“max”,而是像这样在 for 循环中进行初始化:-

int [][] newArray = new int[row][];

for(int i = 0; i < row; i++) {
    if(col <= workArray[i].length){
        newArray[i] = new int[workArray[i].length-1]; //initialize it here
    }
    for(int j = 0; j < workArray[i].length; j++) {
        if(j < col) {
            newArray[i][j] = workArray[i][j];
        }else if (j == col) {
            // Do nothing
        } else if (j > col) {
            newArray[i][j - 1] = workArray[i][j];
        }
    }
}
return newArray;

您还应该 return 修改数组,因为我们无法更改数组的大小,因此我们必须创建一个新数组 (newArray)。所以请将方法定义更改为:-

private static int[][] removeEntry(int[][] workArray, int col)

最后,整个方法看起来像:-

private static int[][] removeEntry(int[][] workArray, int col) {
    int row = workArray.length;
    //largest row count
    int [][] newArray = new int[row][];

    for(int i = 0; i < row; i++) {
        if(col <= workArray[i].length){
            newArray[i] = new int[workArray[i].length-1]; //initialize it here
        }
        for(int j = 0; j < workArray[i].length; j++) {
            if(j < col) {
                newArray[i][j] = workArray[i][j];
            }else if (j == col) {
                // Do nothing
            } else if (j > col) {
                newArray[i][j - 1] = workArray[i][j];
            }
        }
    }
    return newArray;
}

你可以像这样使用它:-

workArray = removeEntry(workArray, 2);