Добавление постепенно уменьшающихся пробелов в java с вложенными циклами for в этой программе Java, вопрос для начинающих

#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);
  

Выводит

 |"""""|
 :::/
  :/
  /:
 /:::
|"""""|
  
 |"""""""""|
 :::::::/
  :::::/
   :::/
    :/
    /:
   /:::
  /:::::
 /:::::::
|"""""""""|
  
 |"""""""""""""""""|
 :::::::::::::::/
  :::::::::::::/
   :::::::::::/
    :::::::::/
     :::::::/
      :::::/
       :::/
        :/
        /:
       /:::
      /:::::
     /:::::::
    /:::::::::
   /:::::::::::
  /:::::::::::::
 /:::::::::::::::
|"""""""""""""""""|