Как объединить вывод двух вложенных циклов рядом друг с другом?

Так что сейчас я работаю над личным проектом, и я сделал программу, которая распечатывает узоры звезд. На одном из звездных узоров я хочу получить такой результат:

Рисунок

*        *
**      **
***    ***
****  ****
**********

Поэтому я сделал один метод распечатать это:

Рисунок 1

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.print("*" + " ");
    }
    System.out.println("");
}
*
**
***
****
*****

И другой метод распечатывает это:

Рисунок 2

for (int i = 0; i < n; i++) {
    for (int j = 2 * (n - i); j >= 0; j--) {
        System.out.print(" ");
    }
    for (int j = 0; j <= i; j++) {
        System.out.print("* ");
    }
    System.out.println();
}
    *
   **
  ***
 ****
*****

Мой вопрос: как разместить звездочки первого метода рядом со звездочками других методов?

Это то, что я получил до сих пор:

public static void printStarsVictory(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            System.out.print("*" + " ");
        }
        System.out.println("");
    }
    for (int i = 0; i < n; i++) {
        for (int j = 2 * (n - i); j >= 0; j--) {
            System.out.print(" ");
        }
        for (int j = 0; j <= i; j++) {
            System.out.print("* ");
        }
        System.out.println();
    }
}

Это то, что печатается до сих пор:

*
**
***
****
*****
    *
   **
  ***
 ****
*****

Есть идеи, как это решить?


person Joseph Attia    schedule 18.11.2020    source источник


Ответы (6)


Я думаю, вы на правильном пути, вам просто нужно объединить две программы во внутренний цикл for:

private static void printStarsVictory(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j < n * 2; j++) {
            if (j <= i || j >= (n * 2 - i)) {
                System.out.print("*");
            } else {
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

Пример использования printStarsVictory(5):

*       *
**     **
***   ***
**** ****
*********

Пример использования printStarsVictory(12):

*                     *
**                   **
***                 ***
****               ****
*****             *****
******           ******
*******         *******
********       ********
*********     *********
**********   **********
*********** ***********
***********************
person Sash Sinha    schedule 18.11.2020

Каждая строка имеет возрастающее количество звезд и уменьшающееся количество пробелов.

например Для n=5 в первом ряду по 2 звезды с каждой стороны и 8 пробелов.

На каждой итерации вы можете увеличивать звезды и уменьшать пробелы и печатать их в одной строке:

public static void printStarsVictory(int n) {

    int sp = n * 2 - 2; // number of spaces

    for (int i = 1; i <= n; i++) {
        printStars(i); // print stars on the left side
        int temp = sp;
        while (temp > 0) {
            System.out.print(" ");
            temp--;
        }
        printStars(i); // // print stars on the right side
        System.out.println(""); 
        sp -= 2; // decrease spaces on each side 
    }
}

public static void printStars(int i) {
    while(i>0) {
        System.out.print("*");
        i--;
    }
}
person Hülya    schedule 18.11.2020

Можете ли вы сохранить их в массиве перед печатью для вывода:

public static void printStarsVictory(int n) {
    StringBuilder[] lines = new StringBuilder[n + 1];

    for (int i = 0; i < n; i++) {
        lines[i] = new StringBuilder();
        for (int j = 0; j <= i; j++) {
            lines[i].append("*" + " ");
        }

        for (int j = 2 * (n - i - 1); j > 0; j--) {
            lines[i].append(" ");
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 2 * (n - i - 1); j > 0; j--) {
            lines[i].append(" ");
        }
        for (int j = 0; j <= i; j++) {
            lines[i].append("* ");
        }
    }

    for (StringBuilder line : lines) {
        System.out.println(line);
    }
}
person Amir Pashazadeh    schedule 18.11.2020

Что ж, System.out.println() печатает только на следующую строку, а не вправо. Единственный выход - создать новый алгоритм. Вы должны поместить все в один цикл.

// loop starts from 0 and user counts from 1, so we wil decrement it by 1
n--;

// this loops moves pointer vertically
for (int i = 0; i < n; i++) {

    // this loops moves pointer horisontally
    for (int j = 0; j < n*2; j++) {

        // here we choose what to print
        if (j <= i || j >= n*2-i) {
            System.out.print("*");
        } else System.out.print(" ");
    }
    System.out.println();
}
person Vasia Zaretskyi    schedule 18.11.2020
comment
Вашему ответу не хватает ясности. Не могли бы вы отредактировать его и сделать его понятным? Бывший. Добавить пример, показать код и т. д. - person Joseph Attia; 18.11.2020
comment
теперь это должно работать лучше, я также добавил несколько комментариев - person Vasia Zaretskyi; 18.11.2020
comment
Только что посмотрел на это в первый раз... Это не дает ожидаемого результата ни для четного, ни для положительного n. - person Sash Sinha; 18.11.2020

Вы можете визуализировать эту цифру как матрицу чисел в диапазоне: [-n, 0] включительно по вертикали и [-n, n] включительно по горизонтали, где каждая точка:

m[i][j] = Math.abs(i) - Math.abs(j);

Если n = 4, то эта матрица выглядит так:

  0  1  2  3  4  3  2  1  0
 -1  0  1  2  3  2  1  0 -1
 -2 -1  0  1  2  1  0 -1 -2
 -3 -2 -1  0  1  0 -1 -2 -3
 -4 -3 -2 -1  0 -1 -2 -3 -4

Попробуйте онлайн!

int n = 4;
IntStream.rangeClosed(-n, 0)
        .map(Math::abs)
        .peek(i -> IntStream.rangeClosed(-n, n)
                .map(Math::abs)
                .mapToObj(j -> i > j ? "  " : "* ")
                .forEach(System.out::print))
        .forEach(i -> System.out.println());

Выход:

*               * 
* *           * * 
* * *       * * * 
* * * *   * * * * 
* * * * * * * * * 

См. также: Создание песочных часов с помощью звездочек в Java

person Community    schedule 24.03.2021

Подобно этому предыдущему ответу, вы можете использовать два вложенных цикла for и один if оператор else таким же образом:

public static void main(String[] args) {
    int n = 9;
    for (int i = -n; i <= 0; i++) {
        for (int j = -n; j <= n; j++)
            if (Math.abs(i) <= Math.abs(j)
                    // in chessboard order
                    && (i + j) % 2 == 0
                    // vertical borders
                    || Math.abs(j) == n)
                System.out.print("*");
            else
                System.out.print(" ");
        System.out.println();
    }
}

Выход:

*                 *
**               **
* *             * *
** *           * **
* * *         * * *
** * *       * * **
* * * *     * * * *
** * * *   * * * **
* * * * * * * * * *
** * * * * * * * **

См. также:
Как напечатать заданный ромб в Java?
Пустой ромб с цифрами

person Community    schedule 24.06.2021