Как работают вложенные циклы, когда дело доходит до печати? - PullRequest
1 голос
/ 27 апреля 2020
public static void printArrayAsStars(int[] array) {
    for(int i = 0; i < array.length; i++) {
        System.out.print("*");
        for(int j = 0; j < array[i] - 1; j++){
            System.out.print("*" + "");
        }
        System.out.println();
    }
}

Попытка выяснить, как это печатает, сбивает с толку, когда я пытаюсь решить это на бумаге. Я знаю, что внешний для l oop печатает строки, но как внутренний для l oop работает и размещает звезды в этом положении?


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

Если они оба имеют одно и то же выражение System.out.print(), то как печатает одну строку, а другая - столбцы? Последняя строка как-то связана с этим?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

println ничего не меняет; он «заканчивает строку» и означает, что любые операторы print, выполненные позже, начнутся с новой строки.

Итак, внешний l oop будет печатать одну звездочку при каждом вызове, а затем делать все, что угодно внутренний l oop делает, затем печатает новую строку. Другими словами, каждый 'внешний l oop' получает свою собственную линию, а каждый внешний l oop означает, что вы получаете как минимум 1 звезду.

Тогда внутренний l oop печатает звезды X-1 где X - значение массива [i]. Учитывая, что внешний l oop всегда печатает звезду, это означает, что каждая строка - это звезды, равные массиву [i], с дополнительным предупреждением, что по крайней мере 1 звезда печатается, даже если массив [i] равен 0 или отрицателен.

И это все.

Итак, ваш массив здесь должен иметь длину 5, а его значения:

int[] array = {5, 1, 3, 4, 2}; // the 1 could be 0 or negative too for the same result.
2 голосов
/ 27 апреля 2020

Суть его print против println.

System.out.print("*");
System.out.print("*" + "");

Оба эти утверждения печатают один символ * и перемещают курсор на один столбец вправо. (Они делают то же самое, потому что бит + "" является излишним. Объединение пустой строки с другой строкой - no-op .)

System.out.println();

Этот оператор перемещает курсор в следующую строку и сбросьте его до первого столбца. Другими словами, он заканчивает текущую строку и начинает новую.

Общий эффект состоит в том, что внутренний l oop печатает линию звезд, оставляя курсор в конце, а окончательный println() переходит к следующей строке. Следовательно, каждая итерация внешнего l oop печатает ряд звезд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...