2017-04-15 68 views
1

我想写一个java方法,将采取一个2d数组,并将内容添加到一个新的二维数组期望指定的行。所以,如果我有二维数组从一个二维数组中删除一列java

1234 
1234 
1234 

,我想删除第3列,我想获得

124 
124 
124 

问题是我无法弄清楚如何得到这个工作。我能想到的最好的方法如下。

private static int[][] removeCol(int [][] array, int colRemove) 
{ 
    int row = array.length; 
    int col = array[0].length; 

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

    for(int i = 0; i < row; i++) 
    { 
     for(int j = 0; j < col; j++) 
     { 
      if(j != colRemove) 
      { 
       newArray[i][j] = array[i][j]; 
      } 
     } 
    } 

    return newEx; 
} 

眼下这个方法将返回该

1204 
1204 
1204 

但它会运行得更好,如果我能得到我想要的结果。有没有办法做到这一点,或者我坚持我目前的结果?

+1

提示:(a)新阵列必须具有较少的列 - 比原来的更小。 (b)要删除的列后面的每个列应该位于索引处*比以前少*。因此,如果您删除第3列,则第4列中的内容现在在第3列,第5列中的内容现在在第4列等等。 – RealSkeptic

回答

0

只需使用另一个索引并不会自动循环运行增量:

private static int[][] removeCol(int [][] array, int colRemove) 
{ 
int row = array.length; 
int col = array[0].length-1; 
int oldCol = array[0].length; 

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

for(int i = 0; i < row; i++) 
{ 
    for(int j = 0, k=0; j < oldCol && k < col; j++) 
    { 
     if(j != colRemove) 
     { 
      newArray[i][k++] = array[i][j]; 
     } 
    } 
} 

return newArray; 
} 
0

通过保持你的逻辑和从零开始的列数:

private static int[][] removeCol(int[][] array, int colRemove) { 
    int row = array.length; 
    int col = array[0].length; 

    int[][] newArray = new int[row][col - 1]; // You will have one column less 

    for (int i = 0; i < row; i++) { 
     for (int j = 0; j < col; j++) { 
     if (j != colRemove) { 
      newArray[i][j > colRemove ? j -1 : j] = array[i][j]; // If you're looking at an index greater than the one to remove, you have to reduce index by one 
     } 
     } 
    } 

    return newArray; 
    } 
1

你可以有一个变量currColumn这表示当前列的位置,结果数组的列将比原始列少一列。所以根据这个你可以改变你的代码。

private static int[][] removeCol(int [][] array, int colRemove) 
{ 
    int row = array.length; 
    int col = array[0].length; 

    int [][] newArray = new int[row][col-1]; //new Array will have one column less 


    for(int i = 0; i < row; i++) 
    { 
     for(int j = 0,currColumn=0; j < col; j++) 
     { 
      if(j != colRemove) 
      { 
       newArray[i][currColumn++] = array[i][j]; 
      } 
     } 
    } 

    return newEx; 
} 

另一个更好的方法是使用像ArrayList这样的动态结构。所以在这里你需要有ArrayList Array,然后你可以用remove()方法去除元素。如果你想更新任何元素,那么你可以使用set()方法。

0

在第二次迭代中,检查colRemove值并为其他迭代移动+1。见下面

private static int[][] removeCol(int [][] array, int colRemove) 
{ 
    int row = array.length; 
    int col = array[0].length-1; 

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

    for(int i = 0; i < row; i++) 
    { 
     for(int j = 0; j < col; j++) 
     { 
      if(j>=colRemove){ 
       newArray[i][j] = array[i][j+1]; 
      } 
      else{ 
       newArray[i][j] = array[i][j]; 
      } 
     } 
    } 

    return newArray; 
} 
0

代码其实你替换的元素由int默认值去掉,那就是:0

如果不删除您复制元素的元素:

if(j != colRemove) 
{ 
    newArray[i][j] = array[i][j]; 
} 

否则你什么也不做(所以从int采用默认0值)。

您应该从1减少新创建的数组的第二维。

你可以按照这种方式:

  • 使用全局循环,该行迭代(数组的第一个维度)

  • 使用两个连续的内部循环迭代的列(阵列的第二维)。
    第一个迭代直到“要删除的列-1”,并在新数组中创建元素的简单副本。
    第二个从“要移除的列”开始,并移动到新数组中原始数组的每个元素左侧。

这里是一个工作码:

import java.util.Arrays; 

public class Array2D { 

    public static void main(String[] args) { 

     int[][] arrayOriginal = new int[][]{{1,2,3,4},{1,2,3,4},{1,2,3,4}}; 
     int[][] arrayNew = removeCol(arrayOriginal, 2); 
     System.out.println(Arrays.deepToString(arrayNew));; 
    } 
    private static int[][] removeCol(int [][] array, int colRemove) 
    { 
     int row = array.length; 
     int col = array[0].length; 

     int [][] newArray = new int[row][col-1]; 

     for(int i = 0; i < row; i++) 
     { 
      for(int j = 0; j < colRemove; j++) 
      {    
       newArray[i][j] = array[i][j];     
      } 

      for(int j = colRemove; j < col-1; j++) 
      {       
       newArray[i][j] = array[i][j+1]; 
      } 

     } 

     return newArray; 
    } 
} 

的输出是:

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