给出两个锯齿状阵列: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循环的第二次迭代中,将所有行设置为长度的长度迭代步骤中当前行的行。
答案 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
,每个行/数组的设置长度/容量与a
和b
中相应行长度的总和相匹配
请注意,c
仍然不包含任何整数值,只包含大小正确的容器,以容纳a
和b
中的值。正如您所提到的,您已经有了使用值填充数组的代码。
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();
}
}
这适用于我的系统...........