将锯齿状2D阵列中的元素组合成一个新的锯齿状2D阵列(深层复制问题)

时间:2015-06-05 01:16:05

标签: java arrays

给出两个锯齿状阵列:a& b其中a + b将始终具有相同的行数:

int[][] a = { {1,2}, {4,5,6} };
int[][] b = { {7}, {8,9,0} };

我究竟能够操纵一个新的锯齿状数组c来返回: { {1,2,7}, {4,5,6,8,9,0} }

这是我到目前为止所拥有的:

int[][] c = null;    
for(int i = 0; i<a.length; i++){
        c = new int[a.length][a[i].length + b[i].length];
}

//rest of my code for assigning the values into the appropriate position works.

正如大家所看到的那样,麻烦出现了,我正在执行深层复制,在for循环的第二次迭代中,将所有行设置为长度的长度迭代步骤中当前行的行。

6 个答案:

答案 0 :(得分:4)

您的方法中的缺陷

您正在循环的每次迭代中创建一个新的2D数组对象。每次通过时,您都会重新分配c,从而丢弃以前的所有工作。此外,同时在两组括号中放置一个数字会导致每行具有相同的长度

使用您的示例,第一次通过循环,c被分配给具有两行的2D数组,每行长度为3。第二次循环,你抛出你以前的2D数组并创建一个有两行的新数组,每行长度为6行。

但是你需要做的是每次通过循环创建一个新行,而不是整个2D数组。

解决方案

首先,我们创建一个名为c的2D数组,并指定它有a.length行。我们没有在第二个括号中放置一个值,因为这表明所有行的长度都相同。所以在这一点上,c不知道行长度。它只知道它可以有多少行。请注意:c实际上还没有 任何行,只有a.length行的容量。

接下来,我们必须创建行并为它们分配长度/容量。我们将循环设置为与行一样多次运行。当前行索引由i表示,因此c[i]指的是2D c数组中的特定行。我们使用new int[]创建每个单独的行/数组,但在括号内,我们必须指定当前行的长度。对于任何行c[i],其长度由a[i]b[i]的长度之和给出;也就是a[i].length + b[i].length

我们剩下的是一个包含行/数组的数组c,每个行/数组的设置长度/容量与ab中相应行长度的总和相匹配

请注意,c仍然不包含任何整数值,只包含大小正确的容器,以容纳ab中的值。正如您所提到的,您已经有了使用值填充数组的代码。

int[][] c = new int[a.length][];     

for (int i = 0; i < a.length; i++) {
    c[i] = new int[a[i].length + b[i].length];
}

答案 1 :(得分:3)

初始化Java 2D数组时,我们将其视为一个表;您只需要给出行数,并且在表的每一行中可以有不同数量的列。

EG。假设我们有一个2D数组调用c定义如下,

?knit_patterns

它说你定义了c包含10个int []元素。但是为了使用它,你必须定义每一行的列数。

EG。假设我们在第二行有3列

primaryStage.setTitle("TEST"); Group root = new Group(); Scene scene = new Scene(root, 400, 300, Color.WHITE); TableView tv1 = new TableView(); TableView tv2 = new TableView(); TableColumn<String, String> clmn = new TableColumn<>("Test"); clmn.setPrefWidth(230); tv1.getColumns().addAll(clmn); tv2.getColumns().addAll(clmn); List<String> firstItems = new ArrayList<>(); firstItems.add("ONE"); firstItems.add("TWO"); firstItems.add("THREE"); tv1.setItems(FXCollections.observableArrayList(firstItems)); List<String> secondItems = new ArrayList<>(); secondItems.add("1"); secondItems.add("2"); secondItems.add("3"); tv2.setItems(FXCollections.observableArrayList(secondItems)); TabPane tabPane = new TabPane(); BorderPane mainPane = new BorderPane(); //Create Tabs Tab tabA = new Tab(); tabA.setText("Tab A"); tabA.setContent(tv1); tabPane.getTabs().add(tabA); Tab tabB = new Tab(); tabB.setText("Tab B"); tabB.setContent(tv2); tabPane.getTabs().add(tabB); mainPane.setCenter(tabPane); mainPane.prefHeightProperty().bind(scene.heightProperty()); mainPane.prefWidthProperty().bind(scene.widthProperty()); root.getChildren().add(mainPane); primaryStage.setScene(scene); primaryStage.show();

因此,在此示例中,您必须添加2D数组int[][] c = new int[10][];int c[1] = new int[3];的列值,以计算结果数组a

b

这将为您提供您的期望。

c

答案 2 :(得分:2)

尝试c[i] = new int[a[i].length + b[i].length]

答案 3 :(得分:2)

int[][] c = new int[a.length][];    
for(int i = 0; i < c.length; i++){
    c[i] = new int[a[i].length + b[i].length];

    int x = 0;
    for (int num : a[i]) {
        c[i][x] = num;
        x++;
    }
    for (int num : b[i]) {
        c[i][x] = num;
        x++;
    }
}

甚至更简单...

int[][] c = new int[a.length][];    
for(int i = 0; i < c.length; i++){
    c[i] = new int[a[i].length + b[i].length];

    System.arraycopy(a[i], 0, c[i], 0, a[i].length);
    System.arraycopy(b[i], 0, c[i], a[i].length, b[i].length);
}

答案 4 :(得分:1)

试试这个:

int[][] c = new int[a.length][];
for(int i = 0; i<a.length; i++){ 
    c[i] = new int [a[i].length + b[i].length];
    int j;
    for(j=0; i < a[i].length; j++){
        c[i][j] = a[i][j];
    }
    for(int k=0; i < b[i].length; k++){ 
        c[i][j+k] = b[i][j]; 
    }
} 

答案 5 :(得分:0)

public static void main(String [] args){

 int[][] a = { {1,2}, {4,5,6} };
 int[][] b = { {7}, {8,9,0} };
 int[][] c = null;    
 for(int i = 0; i<a.length; i++){
         c = new int[a.length][a[i].length + b[i].length];
 }

 for(int i = 0; i<a.length; i++){
    for (int j = 0; j < a[i].length+b[i].length; j++) {


    if(j< a[i].length){
        c[i][j]=a[i][j];
    }

    if(j< a[i].length+b[i].length && j>= a[i].length){
        c[i][j]=b[i][j-a[i].length];
    }


    }

 }


 for(int i = 0; i<a.length; i++){
        for (int j = 0; j < a[i].length+b[i].length; j++) {
  System.out.print(c[i][j]);

        }
        System.out.println();
 }

}

这适用于我的系统...........