В консоли Eclipse, как я могу напечатать несколько вещей один рядом с другим? - PullRequest
1 голос
/ 19 января 2020

ну, это общая идея. Имея это:

Arbol A: 
*3
   +2
      +-3
         +5)
         +-3)
      +8)
   +-1
      +4)
      +-2
         +0)
         +1)

Resultado: 
*14
   +9
      +-1
         +5)
         +-3)
      +8)
   +2
      +4)
      +-1
         +0)
         +1)

Я хочу, чтобы отображаемый результат был таким:

Arbol A:                           Resultado: 
*3                                 *14
   +2                                 +9
      +-3                                +-1      
         +5)                                +5)
         +-3)                               +-3)
      +8)                                +8)
   +-1                                +2                       
      +4)                                +4)
      +-2                                +-1
         +0)                               +0)
         +1)                               +1)



Это только пример, идея состоит в том, чтобы отображать что-либо, не видя результаты один под другим. Может быть, это полезно, но и "Arbol A", и "resultado" являются независимыми методами.

Есть идеи? Я ничего не нашел.

Ответы [ 3 ]

0 голосов
/ 19 января 2020

Нет способа печатать на консоли таким образом. Вы должны печатать построчно. Что вы можете сделать, это взять 2 строки, разрезать их и расположить в столбцы, создав строку, которая выглядит так, как будто имеет 2 столбца. Затем вы можете напечатать эту строку.

Это означает, что вы должны отредактировать методы, которые выводят выходные данные, чтобы они не печатали выходные данные, а возвращали свои выходные данные в виде строки. Например, такой метод:

public static void print1To10() {
    for(int i = 0 ; i < 10 ; i++) {
        System.out.println(i);
    }
}

Необходимо изменить на:

public static String get1To10String() {
    StringBuilder sb = new StringBuilder();
    for(int i = 0 ; i < 10 ; i++) {
        sb.append(i);
        sb.append(System.lineSeparator());
    }
    return sb.toString();
}

Теперь вы можете написать метод, который принимает 2 строки, и расположить их в столбцах. Вот тот, который я написал. Это медленный , и его можно улучшить (не проверял и для крайних случаев), но я не собираюсь, потому что это просто очень грубая реализация, предназначенная, чтобы дать вам представление о том, что должно быть сделано.

// separation is an extra parameter I decide to add in to let the caller specify the distance between the columns.
public static String putSideBySide(String left, String right, int separation) {
    StringBuilder sb = new StringBuilder();
    String[] leftLines = left.split(System.lineSeparator());
    String[] rightLines = right.split(System.lineSeparator());
    int maxLeftLength = Arrays.stream(leftLines).mapToInt(String::length).max().orElse(0);
    int minLines = Math.min(leftLines.length, rightLines.length);

    // for the rows where both the left and right have stuff
    for (int i = 0 ; i < minLines ; i++) {
        sb.append(leftLines[i]);
        for (int j = 0; j < maxLeftLength - leftLines[i].length() + separation; j++) {
            sb.append(' ');
        }
        sb.append(rightLines[i]);
        sb.append(System.lineSeparator());
    }

    if (leftLines.length < rightLines.length) {
        // only the right columns
        for (int i = 0 ; i < rightLines.length - leftLines.length ; i++) {
            for (int j = 0 ; j < maxLeftLength + separation ; j++) {
                sb.append(' ');
            }
            sb.append(rightLines[i + leftLines.length]);
            sb.append(System.lineSeparator());
        }
    } else {
        // only the left columns
        for (int i = 0 ; i < leftLines.length - rightLines.length ; i++) {
            sb.append(leftLines[i + rightLines.length]);
            sb.append(System.lineSeparator());
        }
    }
    return sb.toString();
}

Использование:

public static void main(String[] args){
    System.out.println(putSideBySide(func1(), func2(), 4));
}

public static String func1() {
    return "Hello World,\n" +
            "This is some sample text.\n" +
            "Testing Testing Testing\n" +
            "Lorem Ipsum";
}

public static String func2() {
    return "This is the right column,\n" +
            "which is on the right of the left column.\n" +
            "This column\n" +
            "has\n" +
            "more\n" +
            "rows.";
}

Выход:

Hello World,                 This is the right column,
This is some sample text.    which is on the right of the left column.
Testing Testing Testing      This column
Lorem Ipsum                  has
                             more
                             rows.
0 голосов
/ 20 января 2020

Если у вас нет другого выхода, идущего в STDOUT, вы можете перехватить System.out, захватить вывод во время работы других методов, вернуть System.out в его нормальное состояние, затем переформатировать захваченный вывод и распечатать его.

PrintStream original = System.out;
ByteArrayOutputStream buffer = new ByteArrayOutputStream(4096);
PrintStream tempPrinter = new PrintStream(buffer);
System.setOut(tempPrinter);

// call methods that print

tempPrinter.flush();
System.setOut(original);

String output = buffer.toString(); // contains all output, including new lines

Я оставляю это вам для форматирования и вывода в желаемый формат.
Вы можете найти for (String line : output.split("\\R")) и line.endsWith(":") полезными в этом начинании.

0 голосов
/ 19 января 2020

Попробуйте использовать \ t (tabulator) в строке, а затем просто поместите значения и текстовые элементы в правильные места в строке. \ T работает так же, как и помещая пробел между элементами только потому, что он больше и должен выглядеть так как результат 2

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