Как я могу сократить мой неровный (рваный) код?

Как я могу написать более короткий код для цикла, это возможно? вместо того, чтобы писать;

    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][]);  
Другие вопросы по тегам