用Java漂亮打印2D数组

用Java漂亮打印2D数组,第1张

用Java漂亮打印2D数组

如果您想要类似于MySQL命令行客户端输出的内容,则可以使用以下内容

import java.io.PrintStream;import static java.lang.String.format;import static java.lang.System.out;public final class PrettyPrinter {    private static final char BORDER_KNOT = '+';    private static final char HORIZONTAL_BORDER = '-';    private static final char VERTICAL_BORDER = '|';    private static final String DEFAULT_AS_NULL = "(NULL)";    private final PrintStream out;    private final String asNull;    public PrettyPrinter(PrintStream out) {        this(out, DEFAULT_AS_NULL);    }    public PrettyPrinter(PrintStream out, String asNull) {        if ( out == null ) { throw new IllegalArgumentException("No print stream provided");        }        if ( asNull == null ) { throw new IllegalArgumentException("No NULL-value placeholder provided");        }        this.out = out;        this.asNull = asNull;    }    public void print(String[][] table) {        if ( table == null ) { throw new IllegalArgumentException("No tabular data provided");        }        if ( table.length == 0 ) { return;        }        final int[] widths = new int[getMaxColumns(table)];        adjustColumnWidths(table, widths);        printPreparedTable(table, widths, getHorizontalBorder(widths));    }    private void printPreparedTable(String[][] table, int widths[], String horizontalBorder) {        final int lineLength = horizontalBorder.length();        out.println(horizontalBorder);        for ( final String[] row : table ) { if ( row != null ) {     out.println(getRow(row, widths, lineLength));     out.println(horizontalBorder); }        }    }    private String getRow(String[] row, int[] widths, int lineLength) {        final StringBuilder builder = new StringBuilder(lineLength).append(VERTICAL_BORDER);        final int maxWidths = widths.length;        for ( int i = 0; i < maxWidths; i++ ) { builder.append(padRight(getCellValue(safeGet(row, i, null)), widths[i])).append(VERTICAL_BORDER);        }        return builder.toString();    }    private String getHorizontalBorder(int[] widths) {        final StringBuilder builder = new StringBuilder(256);        builder.append(BORDER_KNOT);        for ( final int w : widths ) { for ( int i = 0; i < w; i++ ) {     builder.append(HORIZONTAL_BORDER); } builder.append(BORDER_KNOT);        }        return builder.toString();    }    private int getMaxColumns(String[][] rows) {        int max = 0;        for ( final String[] row : rows ) { if ( row != null && row.length > max ) {     max = row.length; }        }        return max;    }    private void adjustColumnWidths(String[][] rows, int[] widths) {        for ( final String[] row : rows ) { if ( row != null ) {     for ( int c = 0; c < widths.length; c++ ) {         final String cv = getCellValue(safeGet(row, c, asNull));         final int l = cv.length();         if ( widths[c] < l ) {  widths[c] = l;         }     } }        }    }    private static String padRight(String s, int n) {        return format("%1$-" + n + "s", s);    }    private static String safeGet(String[] array, int index, String defaultValue) {        return index < array.length ? array[index] : defaultValue;    }    private String getCellValue(Object value) {        return value == null ? asNull : value.toString();    }}

并像这样使用它:

final PrettyPrinter printer = new PrettyPrinter(out);printer.print(new String[][] {        new String[] {"FIRST NAME", "LAST NAME", "DATE OF BIRTH", "NOTES"},        new String[] {"Joe", "Smith", "November 2, 1972"},        null,        new String[] {"John", "Doe", "April 29, 1970", "Big Brother"},        new String[] {"Jack", null, null, "(yes, no last name)"},});

上面的代码将产生以下输出:

+----------+---------+----------------+-------------------+|FIRST NAME|LAST NAME|DATE OF BIRTH   |NOTES   |+----------+---------+----------------+-------------------+|Joe       |Smith    |November 2, 1972|(NULL)  |+----------+---------+----------------+-------------------+|John      |Doe      |April 29, 1970  |Big Brother        |+----------+---------+----------------+-------------------+|Jack      |(NULL)   |(NULL)          |(yes, no last name)|+----------+---------+----------------+-------------------+


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5130669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存