您的三个独立数组应合并为一个二维String 数组。这将相似的元素保持在一起。
使用 2D String 数组,我创建了这个输出。我使用较长的项目名称来说明如何计算列宽以创建表格。
-------- Project Table --------
| Project ID | Project Name | Project Status |
| 01 | Create Project | 20 |
| 02 | Create PrintTable class | 70 |
| 03 | Test PrintTable class | 45 |
| 04 | Write Stack Overflow Answer | 30 |
当您面对复杂的应用程序时,您会将任务划分为更小的任务。您一直在划分,直到您可以编写每个任务。创建任务列表的一种方法是编写伪代码。
我用来创建此输出的伪代码如下所示:
Define table name
Define field names
Initialize a 2D String array of projects
Create the output table
Calculate the maximum size of each column
Calculate the total width of the table
Create the table header
Create the header line
Center each field title
For each project
Create a detail line
Center each value
Print the output table.
我大量使用了StringBuilder 类来创建输出表。
我还使用方法重载来创建两个本质上做同样事情的方法。将一些文本居中。有两种方法的原因是,在一个实例中,我输入了StringBuilder。在第二种情况下,我输入了String。
这是完整的可运行示例。
public class PrintTable {
public static void main(String[] args) {
String tableName = "Project";
String[] fieldNames = new String[] { "ID", "Name", "Status" };
PrintTable printTable = new PrintTable();
System.out.println(printTable.createTable(tableName, fieldNames));
}
private String[][] results;
public PrintTable() {
String[][] results = { { "01", "Create Project", "20" },
{ "02", "Create PrintTable class", "70" },
{ "03", "Test PrintTable class", "45" },
{ "04", "Write Stack Overflow Answer", "30" }
};
this.results = results;
}
public String createTable(String tableName, String[] fieldNames) {
int[] maxWidth = calculateMaximumColumnWidth(tableName, fieldNames);
int totalWidth = calculateTotalLineWidth(fieldNames, maxWidth);
StringBuilder builder = createTable(tableName, fieldNames,
maxWidth, totalWidth);
return builder.toString();
}
private int[] calculateMaximumColumnWidth(String tableName,
String[] fieldNames) {
int[] maxWidth = new int[fieldNames.length];
for (int i = 0; i < fieldNames.length; i++) {
maxWidth[i] = tableName.length() + fieldNames[i].length() + 1;
}
for (int row = 0; row < results.length; row++) {
for (int column = 0; column < results[row].length; column++) {
maxWidth[column] = Math.max(maxWidth[column],
results[row][column].length());
}
}
return maxWidth;
}
private int calculateTotalLineWidth(String[] fieldNames, int[] maxWidth) {
int totalWidth = fieldNames.length;
for (int i = 0; i < fieldNames.length; i++) {
totalWidth += maxWidth[i] + 2;
}
return totalWidth;
}
private StringBuilder createTable(String tableName, String[] fieldNames,
int[] maxWidth, int totalWidth) {
StringBuilder builder = new StringBuilder();
builder.append(createTitleLine(tableName, totalWidth));
builder.append(System.lineSeparator());
builder.append(createHeaderLine(tableName, fieldNames, maxWidth));
builder.append(System.lineSeparator());
builder.append(createDetailLines(maxWidth));
return builder;
}
private StringBuilder createTitleLine(String tableName, int length) {
StringBuilder builder = new StringBuilder();
builder.append(createLine('-', 8));
builder.append(" ");
builder.append(tableName);
builder.append(" Table ");
builder.append(createLine('-', 8));
return centerText(builder, length);
}
private StringBuilder createHeaderLine(String tableName,
String[] fieldNames, int[] maxWidth) {
StringBuilder builder = new StringBuilder();
builder.append("| ");
for (int i = 0; i < fieldNames.length; i++) {
StringBuilder text = new StringBuilder();
text.append(tableName);
text.append(" ");
text.append(fieldNames[i]);
builder.append(centerText(text, maxWidth[i]));
builder.append(" | ");
}
return builder;
}
private StringBuilder createDetailLines(int[] maxWidth) {
StringBuilder builder = new StringBuilder();
for (int row = 0; row < results.length; row++) {
builder.append("| ");
for (int column = 0; column < results[row].length; column++) {
builder.append(centerText(results[row][column], maxWidth[column]));
builder.append(" | ");
}
builder.append(System.lineSeparator());
}
return builder;
}
private StringBuilder centerText(String text, int length) {
StringBuilder builder = new StringBuilder(length);
builder.append(text);
return centerText(builder, length);
}
private StringBuilder centerText(StringBuilder text, int length) {
if (text.length() >= length) {
return text;
}
int spaces = (length - text.length()) / 2;
text.insert(0, createLine(' ', spaces));
return text.append(createLine(' ', length - text.length()));
}
private StringBuilder createLine(char c, int length) {
StringBuilder builder = new StringBuilder(length);
for (int i = 0; i < length; i++) {
builder.append(c);
}
return builder;
}
}