我想编写一个应该填充二维数组的函数:
1 - 3 - 5 - 7 - 9
3 - 5 - 7 - 9 - 11
5 - 7 - 9 - 11 - 13
7 - 9 - 11 - 13 - 15
9 - 11 - 13 - 15 - 17
这就是我能想到的......按照我的逻辑它应该有效,但显然我犯了一些错误:
public class Array {
public static void TwoDimFill(int[] [] array, int start, int inc){
array[0] [0] = start;
for (int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length; j++){enter code here
array[i][j+1] = array[i][j] + inc;
}
array [i+1][0] = array[0][i+1];
}
}
public static void main(String[] args){
int[] [] b = new int[5] [5];
TwoDimFill(b, 1, 2);
for (int x = 0; x < b.length; x++){
for (int y = 0; y<b[x].length; y++){
TextIO.put(b[x][y]+"\t");
}
TextIO.putln();
}
}
顺便说一下:这个TextIO.class
是我们用来打印的东西,可以与system.out ...比较...
编辑:已回复!非常感谢你们,你们真棒!
答案 0 :(得分:3)
i + 1和j + 1将超出范围,因为你循环直到&lt;长度。将其更改为&lt;长度-1。
for (int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length -1; j++){
array[i][j+1] = array[i][j] + inc;
}
if (i < array.length -1)
array [i+1][0] = array[0][i+1];
}
编辑:正如评论中所指出的,最后一行输出不正确。变量i可以循环直到&lt;长度,但必须验证索引不会超出范围的最后一行。更正了上面的代码。
答案 1 :(得分:1)
您正在进行的操作数量过多。有一个更清洁,更简单,更快速的解决方案。有时,不同的方法可以更好地解决问题。
for (int i = 0; i < array.length; i++)
for (int j = 0; j < array[i].length; j++)
array[i][j]=((i+j)<<1)+1;
答案 2 :(得分:0)
在执行循环中的最后一行之前,您需要检查索引是否超出范围,以及仅使内部循环迭代到length-1
(因为Java中的数组索引从0开始,以低于其长度的1结束):
for(int i = 0; i < array.length; i++) {
for(int j = 0; j < array[i].length - 1; j++) {
array[i][j + 1] = array[i][j] + inc;
}
if(i + 1 < array.length) {
array[i + 1][0] = array[0][i + 1];
}
}
这会产生:
1 3 5 7 9
3 5 7 9 11
5 7 9 11 13
7 9 11 13 15
9 11 13 15 17
请注意,简单地将外部循环剪切到array.length-1
不起作用(因为在这种情况下,您仍然希望循环的第一部分执行),您最终会得到以下结果:
1 3 5 7 9
3 5 7 9 11
5 7 9 11 13
7 9 11 13 15
9 0 0 0 0
Bolding是我的,注意最后一行显然不正确。
答案 3 :(得分:0)
由于array[i][j+1]
,这是错误的。如果j是最后一个位置j+1
不存在。你可以试试这个:
public static void TwoDimFill(int[] [] array, int start, int inc){
int aux = 0;
for(int i = 0; i < array.length; i++) {
aux = start;
for(int j = 0; j < array[i].length; j++) {
array[i][j] = aux;
aux += inc;
}
start += inc;
}
}
答案 4 :(得分:0)
您可以非常简单地使用以下
public class TestClass {
public static void main(String args[]) {
int[][] temp = new int[5][5];
int[][] output = fill2dim(temp,1,2);
for (int i = 0; i < output.length; i++) {
System.out.println(java.util.Arrays.toString(output[i]));
}
}
public static int[][] fill2dim(int[][] arr, int start, int inc) {
int[][] output = new int[arr.length][arr[0].length];
for (int i = 0;i<arr.length;i++) {
for (int j = i;j<arr[0].length;j++) {
output[i][j] = (i+j)*inc+start;
output[j][i] = (i+j)*inc+start;
}
}
return output;
}
}
你可以通过考虑上三角矩阵来删除一些循环,因为下三角矩阵将是对角线上三角形的反射