Печать фигур на одной линии - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь напечатать квадрат и треугольник на одной линии друг с другом следующим образом:

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

Я уже создал функции, чтобы сделать их индивидуально

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

public static void drawSquare(int width, int height) {
    for (int i = 0; i < height; i++) {
        System.out.print("* ");
    }
    System.out.println();
    for (int i = 0; i < width - 2; i++) {
        System.out.print("* ");
        for (int j = 0; j < height - 2; j++) {
            System.out.print("* ");
        }
        System.out.println("* ");
    }
    for (int i = 0; i < height; i++) {
        System.out.print("* ");
    }
    System.out.println();
}

Но я не знаю, как объединить оба выхода в одной строке.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Объяснение

Измените ваши методы, чтобы они не печатали, а вместо этого создавали List<String>. После этого вы можете легко объединить оба выхода в один.

Большим преимуществом является то, что этот подход более модульный. Вы можете комбинировать это любым способом или любыми другими методами.

Вот как бы вы его использовали:

List<String> squareLines = drawSquare(4, 4);
List<String> triangleLines = drawTriangle(4);

// Iterate both lists
Iterator<String> squareLineIter = squareLines.iterator();
Iterator<String> triangleLineIter = triangleLines.iterator();
while (squareLineIter.hasNext() && triangleLineIter.hasNext()) {
    String squareLine = squareLineIter.next();
    String triangleLine = triangleLineIter.next();

    // Print the combined line
    System.out.println(squareLine + "    " + triangleLine);
}

Обратите внимание, что при этом пропускаются оставшиеся строки более длинного списка. Вы можете легко поддерживать разные размеры, заполнив меньший список пустыми строками.


Изменения

Поэтому измените ваши методы для построения и возврата списков.

Создать результат, изначально пустой, используя

List<String> lines = new ArrayList<>();

Постройте линию, используя StringBuilder

StringBuilder lineBuilder = new StringBuilder();
lineBuilder.append("* "); // Repeat that in a loop
String line = lineBuilder.toString();

Добавьте line к вашему lines, используя

lines.add(line);

Вот ваши полностью измененные методы:

public static List<String> drawTriangle(int n) {
    // Build the lines
    List<String> lines = new ArrayList<>();

    int k = 2 * n - 5;
    for (int i = 0; i < n; i++) {
        // Build the current line
        StringBuilder lineBuilder = new StringBuilder();
        for (int j = 0; j < k; j++) {
            lineBuilder.append(" ");
        }
        k = k - 1;
        for (int j = 0; j <= i; j++) {
            lineBuilder.append("* ");
        }
        // Add the line
        lines.add(lineBuilder.toString());
    }
    return lines;
}

public static List<String> drawSquare(int width, int height) {
    // Build the lines
    List<String> lines = new ArrayList<>();

    // Build a line
    StringBuilder lineBuilder = new StringBuilder();
    for (int i = 0; i < height; i++) {
        lineBuilder.append("* ");
    }
    // Add the line
    lines.add(lineBuilder.toString());

    for (int i = 0; i < width - 2; i++) {
        // Build the current line
        lineBuilder = new StringBuilder();
        lineBuilder.append("* ");
        for (int j = 0; j < height - 2; j++) {
            lineBuilder.append("* ");
        }
        lineBuilder.append("* ");
        // Add the line
        lines.add(lineBuilder.toString());
    }

    // Build a line
    lineBuilder = new StringBuilder();
    for (int i = 0; i < height; i++) {
        lineBuilder.append("* ");
    }
    // Add the line
    lines.add(lineBuilder.toString());

    return lines;
}
0 голосов
/ 15 мая 2018

Решение

Самое простое решение - объединить 2 метода в 1, как показано ниже:

public static void drawTriangleAndSquare(int widthS, int heightS) {
    // number of leading spaces in front of triangle
    int k = 2 * heightS - 5;

    // print square
    for (int i = 0; i < heightS; i++) {
        for (int j = 0; j < widthS; j++) {
            System.out.print("* ");
        }

        // print triangle
        System.out.print("\t");
        for (int j = 0; j < k; j++) {
            System.out.print(" ");
        }

        k--;

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

        System.out.println();
    }
}

public static void main(String[] args) {
    drawTriangleAndSquare(5, 4);
}

выход

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

Обратите внимание, что я немного очистил ваш код, особенно функцию drawSquare().


Ограничение

Моя реализация позволяет печатать только квадрат и треугольник одинаковой высоты (они оба зависят от переменной heightS в drawTriangleAndSquare()).

P.S. если вы хотите больше пробелов между треугольником и квадратом, просто добавьте больше \t s в System.out.print("\t").

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