Есть ли простой способ вывести два столбца на консоль в Java? - PullRequest
32 голосов
/ 31 марта 2009

Как видно из заголовка, есть ли простой способ вывода двух колонок на консоль в Java?

Мне известно о \t, но я не нашел пути к пробелу на основе определенного столбца при использовании printf.

Ответы [ 3 ]

53 голосов
/ 31 марта 2009

Используйте спецификаторы ширины и точности, установив одно и то же значение. Это будет дополнять слишком короткие строки и обрезать слишком длинные строки. Флаг '-' выравнивает значения в столбцах по левому краю.

System.out.printf("%-30.30s  %-30.30s%n", v1, v2);
25 голосов
/ 19 мая 2011

я сделал это без использования класса Formatter как:

 
System.out.printf("%-10s %-10s %-10s\n", "osne", "two", "thredsfe");
System.out.printf("%-10s %-10s %-10s\n", "one", "tdsfwo", "thsdfree");
System.out.printf("%-10s %-10s %-10s\n", "onsdfe", "twdfo", "three");
System.out.printf("%-10s %-10s %-10s\n", "odsfne", "twsdfo", "thdfree");
System.out.printf("%-10s %-10s %-10s\n", "osdne", "twdfo", "three");
System.out.printf("%-10s %-10s %-10s\n", "odsfne", "tdfwo", "three");

и вывод составил

osne       two        thredsfe  
one        tdsfwo     thsdfree  
onsdfe     twdfo      three     
odsfne     twsdfo     thdfree   
osdne      twdfo      three     
odsfne     tdfwo      three     
12 голосов
/ 31 октября 2014

Поздний ответ, но если вы не хотите жестко задавать ширину, как на счет того, что работает следующим образом:

public static void main(String[] args) {
    new Columns()
        .addLine("One", "Two", "Three", "Four")
        .addLine("1", "2", "3", "4")
        .print()
    ;
}

И отображает:

One Two Three Four 
1   2   3     4    

Ну, все, что нужно, это:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;  

public class Columns {

    List<List<String>> lines = new ArrayList<>();
    List<Integer> maxLengths = new ArrayList<>();
    int numColumns = -1;

    public Columns addLine(String... line) {

        if (numColumns == -1){
            numColumns = line.length;
            for(int column = 0; column < numColumns; column++) {
                maxLengths.add(0);
            }
        }

        if (numColumns != line.length) {
            throw new IllegalArgumentException();
        }

        for(int column = 0; column < numColumns; column++) {
            int length = Math
                .max( 
                    maxLengths.get(column), 
                    line[column].length() 
                )
            ;
            maxLengths.set( column, length );
        }

        lines.add( Arrays.asList(line) );

        return this;
    }

    public void print(){
        System.out.println( toString() );
    }

    public String toString(){
        String result = "";
        for(List<String> line : lines) {
            for(int i = 0; i < numColumns; i++) {
                result += pad( line.get(i), maxLengths.get(i) + 1 );                
            }
            result += System.lineSeparator();
        }
        return result;
    }

    private String pad(String word, int newLength){
        while (word.length() < newLength) {
            word += " ";            
        }       
        return word;
    }
}

Поскольку он не будет печатать до тех пор, пока не будет всех строк, он может узнать, как широко сделать столбцы. Не нужно жестко кодировать ширину.

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