Hoe een informatietabel in Java af te drukken

Ik probeer een tabel in Java af te drukken en ik vroeg me af wat de beste manier is om dit te doen?

Ik heb geprobeerd nieuwe regels af te drukken en \t te gebruiken om de inhoud op een rij te zetten, maar het werkt niet. Is er een methode die dit doet of een betere manier?


Antwoord 1, autoriteit 100%

U kunt System.out.format(…)

. gebruiken

Voorbeeld:

final Object[][] table = new String[4][];
table[0] = new String[] { "foo", "bar", "baz" };
table[1] = new String[] { "bar2", "foo2", "baz2" };
table[2] = new String[] { "baz3", "bar3", "foo3" };
table[3] = new String[] { "foo4", "bar4", "baz4" };
for (final Object[] row : table) {
    System.out.format("%15s%15s%15s%n", row);
}

Resultaat:

       foo            bar            baz
       bar2           foo2           baz2
       baz3           bar3           foo3
       foo4           bar4           baz4

Of gebruik de volgende code voor links uitgelijnde uitvoer:

System.out.format("%-15s%-15s%-15s%n", row);

Antwoord 2, autoriteit 32%

Algemene functie om een lijst met arrays in tabellen op te maken:

public static String formatAsTable(List<List<String>> rows)
{
    int[] maxLengths = new int[rows.get(0).size()];
    for (List<String> row : rows)
    {
        for (int i = 0; i < row.size(); i++)
        {
            maxLengths[i] = Math.max(maxLengths[i], row.get(i).length());
        }
    }
    StringBuilder formatBuilder = new StringBuilder();
    for (int maxLength : maxLengths)
    {
        formatBuilder.append("%-").append(maxLength + 2).append("s");
    }
    String format = formatBuilder.toString();
    StringBuilder result = new StringBuilder();
    for (List<String> row : rows)
    {
        result.append(String.format(format, row.toArray(new String[0]))).append("\n");
    }
    return result.toString();
}

Gebruik:

List<List<String>> rows = new ArrayList<>();
List<String> headers = Arrays.asList("Database", "Maintainer", "First public release date", "Latest stable version", "Latest release date");
rows.add(headers);
rows.add(Arrays.asList("4D (4th Dimension)", "4D S.A.S.", "1984", "v16.0", "2017-01-10"));
rows.add(Arrays.asList("ADABAS", "Software AG", "1970", "8.1", "2013-06"));
rows.add(Arrays.asList("Adaptive Server Enterprise", "SAP AG", "1987", "16.0", "2015"));
rows.add(Arrays.asList("Apache Derby", "Apache", "2004", "10.14.1.0", "2017-10-22"));
System.out.println(formatAsTable(rows));

Het resultaat:

Database                    Maintainer   First public release date  Latest stable version  Latest release date  
4D (4th Dimension)          4D S.A.S.    1984                       v16.0                  2017-01-10           
ADABAS                      Software AG  1970                       8.1                    2013-06              
Adaptive Server Enterprise  SAP AG       1987                       16.0                   2015                 
Apache Derby                Apache       2004                       10.14.1.0              2017-10-22    

Antwoord 3, Autoriteit 12%

Dit is een manier om het te doen:

public class StoreItem {
private String itemName;
private double price;
private int quantity;
public StoreItem(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", "Item", "|", "Price($)", "|", "Qty"));
    System.out.println(String.format("%s", "----------------------------------------------------------------------------------------------------------------"));
}
public void printInvoice() {
    System.out.println(String.format("%30s %25s %10.2f %25s %10s", this.getItemName(), "|", this.getPrice(), "|", this.getQuantity()));
}
public static List<StoreItem> buildInvoice() {
    List<StoreItem> itemList = new ArrayList<>();
    itemList.add(new StoreItem("Nestle Decaff Coffee", 759.99, 2));
    itemList.add(new StoreItem("Brown's Soft Tissue Paper", 15.80, 2));
    itemList.add(new StoreItem("LG 500Mb External Drive", 700.00, 2));
    return itemList;
}
public static void main (String[] args) {
    StoreItem.printInvoiceHeader();
    StoreItem.buildInvoice().forEach(StoreItem::printInvoice);
 }

}

Uitvoer:


Antwoord 4, autoriteit 4%

Schrijf een functie die een tekenreeks met spaties op de gewenste kolomlengte opvult. Dit kan een statische helper zijn en je kunt een klasse StrUtils of iets dergelijks maken om deze vast te houden.

(Er kunnen ook Apache- of andere bibliotheken zijn met String-helpers/utils om dit voor u te doen.)

Als u op de lange termijn gegevens in tabelvorm uitvoert, kunt u overwegen om CSV (voor Excel enz.) of XML te exporteren. Maar deze zijn bedoeld voor typische zakelijke vereisten op de lange termijn, niet alleen om snel naar het scherm te gaan.


Antwoord 5

Er is een kleine bibliotheek met een functie voor het afdrukken van tabellen in Markdown-indeling:
https://github.com/mjfryc/mjaron-etudes-java

  • Er is elke Iterablenodig die “records” en een herhaalde typeklasse bevat.
  • Itereert over alle openbare en privé-velden in de klas.
  • Het verwacht dat:
    • veld is openbaar
      public String something;of
    • veld is privé, maar heeft een openbare getter-methode
      public String getSomething();of

      • als het type booleanis, kan het beginnen met has:
        public boolean hasSomething();
import pl.mjaron.etudes.Obj;
...
List<Cat> cats = Arrays.asList(cat0, cat1);
String table = Obj.asTable(cats, Cat.class);

Voorbeelduitvoer:

| name | legsCount |  lazy | topSpeed |
| ---- | --------- | ----- | -------- |
| John |         4 |  true |    35.24 |
|  Bob |         5 | false |     75.0 |

PS ik ben de auteur van deze bibliotheek, veel plezier.

Other episodes