Java: Print a 2D String array as a right-justified table
Solution 1
Indeed, if you specify a width for the fields, it should be right-justified.
If you need to have a dynamic padding, minimal for the longest string, you have to walk the array, getting the maximal width, generate the format string with the width computed from this maxima, and use it for format the output.
Solution 2
Here's an answer, using dynamically-generated format strings for each column:
public static void printTable(String[][] table) {
// Find out what the maximum number of columns is in any row
int maxColumns = 0;
for (int i = 0; i < table.length; i++) {
maxColumns = Math.max(table[i].length, maxColumns);
}
// Find the maximum length of a string in each column
int[] lengths = new int[maxColumns];
for (int i = 0; i < table.length; i++) {
for (int j = 0; j < table[i].length; j++) {
lengths[j] = Math.max(table[i][j].length(), lengths[j]);
}
}
// Generate a format string for each column
String[] formats = new String[lengths.length];
for (int i = 0; i < lengths.length; i++) {
formats[i] = "%1$" + lengths[i] + "s"
+ (i + 1 == lengths.length ? "\n" : " ");
}
// Print 'em out
for (int i = 0; i < table.length; i++) {
for (int j = 0; j < table[i].length; j++) {
System.out.printf(formats[j], table[i][j]);
}
}
}
Solution 3
find the length of the longest string..
left pad all the strings with spaces until they r that length + 1
System.out.print them using 2 nested for loops
Comments
-
Chris Conway almost 2 years
What is the best way to print the cells of a
String[][]
array as a right-justified table? For example, the input{ { "x", "xxx" }, { "yyy", "y" }, { "zz", "zz" } }
should yield the output
x xxx yyy y zz zz
This seems like something that one should be able to accomplish using
java.util.Formatter
, but it doesn't seem to allow non-constant field widths. The best answer will use some standard method for padding the table cells, not the manual insertion of space characters. -
Alexander Aleksandrovič Klimov over 15 yearsNeed to keep the length of the longest string in each column, probably, but otherwise close enough. Also, use printf to do the left-padding - question was tagged with printf.
-
Chris Conway over 15 yearsDynamically-generated format strings... Smacking my forehead... :-)