【问题标题】:Print 3 arrays as a table in java在java中将3个数组打印为表格
【发布时间】:2025-12-06 03:10:02
【问题描述】:

在java中将3个数组打印为表格

我尝试以不同的方式将 3 个数组打印为表格。但我想知道这样做正确的方式。请帮帮我。

这 3 个是我的数组

Object[] arrayObjects = new GetDataFromDB().projectDB();
String[] arr_projectID = (String[])arrayObjects[0];
String[] arr_projectName = (String[])arrayObjects[1];
int[] arr_projectStatus = (int[])arrayObjects[2];

我怎样才能像这样打印表格,

     -------- Project Table --------
| ProjectID | ProjectName | ProjectStatus |
|     01    |     p001    |       20      |
|     02    |     p002    |       70      |
|     03    |     p003    |       45      |
|     ..    |     ....    |       ..      |
|     ..    |     ....    |       ..      |

我试过这样,

        String printPID ="";
        String printPName ="";
        String printPStatus ="";
        
        for (int i = 0; i < arr_projectID.length; i++) {
            
             pID = pID +"\n" + arr_projectID[i];
             printPID = "Project ID" + pID + "\n";
        } 
        
         for (int i = 0; i < arr_projectName.length; i++) {
            
             pName = pName + "\n" + arr_projectName[i];
             printPName = "Project name" + pName + "\n";
        } 
         
          for (int i = 0; i < arr_projectStatus.length; i++) {
            
             pStatus = pStatus + "\n" + arr_projectStatus[i];
             printPStatus = "Project Status" + pStatus + "\n";
        }

【问题讨论】:

  • 你试过什么?你被困在哪里了?
  • 您不能将 Object 数组转换为 int 数组。您可以转换为整数数组。
  • OP 正在将一个对象转换为一个 int 数组;不是一个对象数组到一个 int 数组。
  • 我通过使用 for 循环将所有数据放入 3 个字符串变量中,并将它们全部放入 3 个字符串数组中。但我被我的打印方法卡住了。
  • 这里我在打印时添加了卡住的步骤@xehpuk

标签: java arrays loops arraylist indexing


【解决方案1】:

您的三个独立数组应合并为一个二维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;
    }

}

【讨论】:

    【解决方案2】:
    public class Foo {
    
        public static void main(String... args) throws IOException, InterruptedException {
            String[] ids = { "01", "02", "03" };
            String[] names = { "p001", "p002", "p003" };
            int[] statuses = { 20, 70, 45 };
    
            printTable(ids, names, statuses);
        }
    
        private static final String ID_COLUMN_NAME = "ProjectID";
        private static final String NAME_COLUMN_NAME = "ProjectName";
        private static final String STATUS_COLUMN_NAME = "ProjectStatus";
    
        public static void printTable(String[] ids, String[] names, int[] statuses) {
            int idColumnWidth = Math.max(ID_COLUMN_NAME.length() + 2, getMaxLength(ids));
            int nameColumnWidth = Math.max(NAME_COLUMN_NAME.length() + 2, getMaxLength(names));
            int statusColumnWidth = Math.max(STATUS_COLUMN_NAME.length() + 2, getMaxLength(statuses));
            int tableWidth = idColumnWidth + nameColumnWidth + statusColumnWidth + 4;
    
            System.out.println(middle("-------- Project Table --------", tableWidth));
            System.out.println('|' + middle(ID_COLUMN_NAME, idColumnWidth) +
                    '|' + middle(NAME_COLUMN_NAME, nameColumnWidth) +
                    '|' + middle(STATUS_COLUMN_NAME, statusColumnWidth) + '|');
    
            for (int i = 0; i < ids.length; i++)
                System.out.println('|' + middle(ids[i], idColumnWidth) +
                        '|' + middle(names[i], nameColumnWidth) +
                        '|' + middle(String.valueOf(statuses[i]), statusColumnWidth) + '|');
        }
    
        private static int getMaxLength(String[] arr) {
            return Arrays.stream(arr)
                         .mapToInt(String::length)
                         .max().orElse(0);
        }
    
        private static int getMaxLength(int[] arr) {
            return Arrays.stream(arr)
                         .mapToObj(String::valueOf)
                         .mapToInt(String::length)
                         .max().orElse(0);
        }
    
        private static String middle(String str, int columnWidth) {
            StringBuilder buf = new StringBuilder(columnWidth);
            int offs = (columnWidth - str.length()) / 2;
    
            for (int i = 0; i < offs; i++)
                buf.append(' ');
    
            buf.append(str);
    
            while (buf.length() < columnWidth)
                buf.append(' ');
    
            return buf.toString();
        }
    
    }
    

    输出:

          -------- Project Table --------      
    | ProjectID | ProjectName | ProjectStatus |
    |    01     |    p001     |      20       |
    |    02     |    p002     |      70       |
    |    03     |    p003     |      45       |
    

    【讨论】:

      【解决方案3】:

      桌子和你的照片差不多,哈哈

      package com.company;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class Main {
      
          private String itemName;
          private double price;
          private int quantity;
      
      
          public Main(String itemName, double price, int quantity) {
              this.setItemName(itemName);
              this.setPrice(price);
              this.setQuantity(quantity);
          }
      
      
          public String getItemName() {
              return itemName;
          }
      
          public void setItemName(String itemName) {
              this.itemName = itemName;
          }
      
          public double getPrice() {
              return price;
          }
      
          public void setPrice(double price) {
              this.price = price;
          }
      
          public int getQuantity() {
              return quantity;
          }
      
          public void setQuantity(int quantity) {
              this.quantity = quantity;
          }
      
      
          public static void printInvoiceHeader() {
              System.out.println(String.format("%30s %25s %10s %25s %10s", "Project ID", "|", "Project Name", "|", "Project Status"));
              System.out.println(String.format("%s", "----------------------------------------------------------------------------------------------------------------"));
          }
      
          public void printInvoice() {
              System.out.println(String.format("%30s %25s %10.2f %25s %10s", this.getItemName(), "| p", this.getPrice(), "|", this.getQuantity()));
          }
      
          public static List<Main> buildInvoice() {
              List<Main> itemList = new ArrayList<>();
              itemList.add(new Main("01", 1, 20));
              itemList.add(new Main("02", 2, 70));
              itemList.add(new Main("03", 3, 45));
              return itemList;
          }
      
          public static void main(String[] args) {
      
              Main.printInvoiceHeader();
              Main.buildInvoice().forEach(Main::printInvoice);
          }
      }
      

      【讨论】: