从二维数组中删除一列
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]
如果您错误地将方法设为 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]
数组是固定大小的。在初始化数组时,其中存储了一个默认值。这里,默认存储 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);
我对从二维数组中删除 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]
如果您错误地将方法设为 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]
数组是固定大小的。在初始化数组时,其中存储了一个默认值。这里,默认存储 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);