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
Iterable
nodig 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();
- als het type booleanis, kan het beginnen met has:
- veld is openbaar
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.