Есть ли простой способ вывода двух столбцов на консоль в Java?
Как гласит название, есть ли простой способ вывода двух столбцов в консоль на Java?
Я знаю \t
, но я не нашел путь к пространству на основе определенного столбца при использовании printf.
Ответы
Ответ 1
Используйте спецификаторы ширины и точности, заданные для одного и того же значения. Это приведет к слишком коротким строкам и усечению строк, которые слишком велики. Флаг '-' будет выравнивать значения в столбцах.
System.out.printf("%-30.30s %-30.30s%n", v1, v2);
Ответ 2
Я сделал это без использования класса Formatter как:
System.out.printf("%-10s %-10s %-10s\n", "osne", "two", "thredsfe");
System.out.printf("%-10s %-10s %-10s\n", "one", "tdsfwo", "thsdfree");
System.out.printf("%-10s %-10s %-10s\n", "onsdfe", "twdfo", "three");
System.out.printf("%-10s %-10s %-10s\n", "odsfne", "twsdfo", "thdfree");
System.out.printf("%-10s %-10s %-10s\n", "osdne", "twdfo", "three");
System.out.printf("%-10s %-10s %-10s\n", "odsfne", "tdfwo", "three");
и вывод был
osne two thredsfe
one tdsfwo thsdfree
onsdfe twdfo three
odsfne twsdfo thdfree
osdne twdfo three
odsfne tdfwo three
Ответ 3
Поздний ответ, но если вы не хотите жестко кодировать ширину, как насчет того, что работает так:
public static void main(String[] args) {
new Columns()
.addLine("One", "Two", "Three", "Four")
.addLine("1", "2", "3", "4")
.print()
;
}
И отображает:
One Two Three Four
1 2 3 4
Ну все, что требуется:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Columns {
List<List<String>> lines = new ArrayList<>();
List<Integer> maxLengths = new ArrayList<>();
int numColumns = -1;
public Columns addLine(String... line) {
if (numColumns == -1){
numColumns = line.length;
for(int i = 0; i < numColumns; i++) {
maxLengths.add(0);
}
}
if (numColumns != line.length) {
throw new IllegalArgumentException();
}
for(int i = 0; i < numColumns; i++) {
maxLengths.set( i, Math.max( maxLengths.get(i), line[i].length() ) );
}
lines.add( Arrays.asList(line) );
return this;
}
public void print(){
System.out.println( toString() );
}
public String toString(){
String result = "";
for(List<String> line : lines) {
for(int i = 0; i < numColumns; i++) {
result += pad( line.get(i), maxLengths.get(i) + 1 );
}
result += System.lineSeparator();
}
return result;
}
private String pad(String word, int newLength){
while (word.length() < newLength) {
word += " ";
}
return word;
}
}
Так как он не будет печататься до тех пор, пока он не будет иметь все строки, он сможет узнать, как широко использовать столбцы. Нет необходимости жестко кодировать ширину.