Как я могу сократить мой неровный (рваный) код?
Как я могу написать более короткий код для цикла, это возможно? вместо того, чтобы писать;
int array[][] = new int[10][];
array[0] = new int[1];
array[1] = new int[2];
array[2] = new int[3];
array[3] = new int[4];
array[4] = new int[5];
array[5] = new int[6];
array[6] = new int[7];
array[7] = new int[8];
array[8] = new int[9];
array[9] = new int[10];
Вот мой код;
int array[][] = new int[10][];
array[0] = new int[1];
array[1] = new int[2];
array[2] = new int[3];
array[3] = new int[4];
array[4] = new int[5];
array[5] = new int[6];
array[6] = new int[7];
array[7] = new int[8];
array[8] = new int[9];
array[9] = new int[10];
for (int i = 0; i < 10; i++){
for (int j = 0; j < i + 1; j++) {
array[i][j] = i + j;
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j < i + 1; j++)
System.out.printf("%-4d",array[i][j]);
System.out.println();
}
}
}
5 ответов
Решение
Для общего решения, если вы решили изменить длину массива
int array[][] = new int[10][];
for (int i = 0; i < array.length; i++) {
array[i] = new int[i + 1];
}
Вы также можете объединить две петли, как
for (int i = 0; i < array.length; i++) {
array[i] = new int[i + 1];
for (int j = 0; j < i + 1; j++) {
array[i][j] = i + j;
}
}
Вы можете попытаться переместить инициализацию внутри цикла
int array[][] = new int[10][];
for (int i = 0; i < 10; i++){
array[i] = new int[i + 1];
for (int j = 0; j < i + 1; j++) {
array[i][j] = i + j;
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j < i + 1; j++)
System.out.printf("%-4d",array[i][j]);
System.out.println();
}
Код теперь короче спасибо:)
int array[][] = new int[10][];
for (int i = 0; i < array.length; i++)
{
array[i] = new int[i + 1];
for (int j = 0; j < i + 1; j++)
{
array[i][j] = i + j;
}
}
for (int[] row : array)
{
for(int k:row)
System.out.print( k+ " ");
System.out.println();
}
Как насчет этого?
for (int i = 0; i < 10; i++){
array[i] = new int[i + 1]
}
или просто ради удовольствия сделать его функциональным (не спрашивайте о других аспектах)
//just the empty array
int[][] array = IntStream.range(0, 10)
.map(i -> i + 1)
.mapToObj(int[]::new)
.toArray(int[][]::new);
Или инициализируйте и заполните массив в функциональном стиле:
//the array with values
int[][] array = IntStream.range(0, 10)
.mapToObj(v -> IntStream.range(v, v + v + 1).toArray())
.toArray(int[][]::new);
И даже сделать вывод таким образом:
String out = Arrays.stream(array)
.map(x -> Arrays.stream(x)
.mapToObj(y -> String.format("%-4d", y))
.collect(Collectors.joining()))
.collect(Collectors.joining("\n"));
System.out.println(out);
С Java 8:
Integer[][] a = new ArrayList<Integer[]>(Collections.nCopies( 10, new Integer[0] ))
.stream()
.map( p -> new Integer[p.length +1] )
.toArray(size -> new Integer[size][]);