#java
#java
Вопрос:
в настоящее время пытаюсь написать это на Java, но, похоже, я не могу правильно расставить пробелы и двоеточия с помощью циклов for.
|"""""""""|
:::::::/
:::::/
:::/
:/
/:
/:::
/:::::
/:::::::
|"""""""""|
^ то, что я пытаюсь написать
мой код в настоящее время :
public class nested4loops {
public static void main(String[] args) {
timething();
}
public static void timething() {
System.out.println("|"""""""""|");
for (int i = 0; i < 5; i ) {
for (int s = 0; s < i; s ) {
System.out.print(" ");
}
System.out.print("\");
for (int b = 7; b > i; b--) {
System.out.print(":");
}
System.out.println();
}
}
}
Однако в настоящее время этот код печатает:
|"""""""""|
:::::::
::::::
:::::
::::
:::
Ответ №1:
Один из способов сделать это — иметь 2 цикла, один для верхней части и один для нижней части.
Однако это означает, что тело этих циклов повторяется, что нарушает принцип DRY (не повторяйтесь).
Это, конечно, можно решить, переместив общую логику в методы, например, так:
public static void printHourGlass(int size) {
printEndRow(size);
for (int row = 1; row < size; row )
printGlassRow(row, size, '\', '/');
for (int row = size - 1; row > 0; row--)
printGlassRow(row, size, '/', '\');
printEndRow(size);
}
private static void printEndRow(int size) {
System.out.println("|" repeat('"', size * 2 - 1) "|");
}
private static void printGlassRow(int row, int size, char left, char right) {
System.out.println(repeat(' ', row) left repeat(':', (size - row) * 2 - 1) right);
}
private static String repeat(char ch, int count) {
char[] buf = new char[count];
Arrays.fill(buf, ch);
return new String(buf);
}
Тесты
printHourGlass(3);
printHourGlass(5);
printHourGlass(9);
Выводит
|"""""|
:::/
:/
/:
/:::
|"""""|
|"""""""""|
:::::::/
:::::/
:::/
:/
/:
/:::
/:::::
/:::::::
|"""""""""|
|"""""""""""""""""|
:::::::::::::::/
:::::::::::::/
:::::::::::/
:::::::::/
:::::::/
:::::/
:::/
:/
/:
/:::
/:::::
/:::::::
/:::::::::
/:::::::::::
/:::::::::::::
/:::::::::::::::
|"""""""""""""""""|