Равный интервал в перечислениях? - PullRequest
0 голосов
/ 23 января 2012

Я работал над уроком по Java, и этот раздел был посвящен перечислениям. У меня есть это в моем Enum:

public enum tuna {
 Camaro("Orange", "1968"),
 Silverado("Red","1996"),
 Sierra("Black","2007"),
 Equinox("Silver","2011");

  private final String color;
  private final String year;


tuna(String carColor, String age){
    color = carColor;
    year = age;

 }
public String getColor(){
    return color;
 }

public String getYear(){
    return year;
 }
}

и это в моем классе Java, который печатает это:

for(tuna cars: tuna.values()){
    System.out.printf("%s\t\t%s\t\t%s\n", cars, cars.getColor(), cars.getYear()

Который распечатывает:

enter image description here

Видите, как «Красный» и «1996» для Сильверадо расположены намного правее (потому что «Сильверадо» длиннее других слов)? Ну, как я могу это исправить, чтобы детали длинных слов были на одинаковом расстоянии от остальных?

P.S. если я сокращу «Сильверадо» до «Серебро», это нормально:

enter image description here

Ответы [ 5 ]

5 голосов
/ 23 января 2012

Я бы предложил использовать не вкладки, а форматирование строк, т. Е. Использовать System.out.format(...) и вычислять длину каждого спецификатора формата, получая длину самого длинного имени.Затем создайте строку формата динамически.

Пример:

//that's a shortcut, you'd have to calculate the max
int maxlength = tuna.Silverado.name().length();

for( tuna t : tuna.values() ) {
  System.out.format( "%-" + maxlength + "s   %-10s %4s\n", t.name(), t.getColor(), t.getYear() );
}

Вывод:

Camaro      Orange     1968
Silverado   Red        1996
Sierra      Black      2007
Equinox     Silver     2011
3 голосов
/ 23 января 2012

Символ табуляции (\t) перемещает курсор вперед, пока он не достигнет позиции, кратной размеру табулятора: если размер равен, например, 8, он перейдет в 0, 8, 16, 24 и т. Д. Так как "Silverado"имеет длину 9 символов, это приведет к значению 16, а не 8.

Вы должны сделать свои собственные табуляции: добавлять пробелы на основе длины предыдущей строки вместо использования \t.

Если вы хотите самое простое решение, определите подходящую максимальную длину для каждого поля и рассчитайте вкладку на основе этого, опционально обрезая строки, которые длиннее этого.

Для динамического решения вы бынеобходимо проверить максимальную длину, которая вам понадобится, исходя из имеющихся у вас предметов.Это позволяет получить минимальное необходимое расстояние.

0 голосов
/ 23 января 2012

Это не имеет ничего общего с перечислениями.Единственное, что имеет значение, это строка:

System.out.printf("%s\t%s\t\t%s\n", cars, cars.getColor(), cars.getYear()

Что вам нужно, это заполнение строк.Вы можете использовать System.out.format методы, которые позволяют заполнение в форме %5s, что означает, что строка будет дополнять строку до 5 пробелов.

Таким образом, вы можете вычислить максимальную длину ваших полейи динамически построить строку формата:

    int maxCars = 0;
    int maxColor = 0;
    int maxYear = 0;

    for(tuna cars: tuna.values()) {
        maxCars = Math.max(maxCars, cars.toString().length());
        maxColor = Math.max(maxColor, cars.getColor().length());
        maxYear = Math.max(maxYear, cars.getYear().length());
    }

    String formatStr = "%"+(maxCars+5)+"s%"+(maxColor+5)+"s%"+(maxYear+5)+"s\n";

    for(tuna cars: tuna.values())
        System.out.format(formatStr, cars, cars.getColor(), cars.getYear());

Вывод:

        Camaro     Orange     1968
     Silverado        Red     1996
        Sierra      Black     2007
       Equinox     Silver     2011
0 голосов
/ 23 января 2012

Не используйте вкладки вообще.Вместо этого используйте printf лучше, чтобы максимизировать его гибкость, используя константы int с вашими полями% s.т. е.% 10s или% -10s или любые другие константы int лучше всего подходят для этого столбца.

0 голосов
/ 23 января 2012

Это интервал между вкладками - вы получите то же самое, если будете использовать вкладки таким образом в текстовом редакторе.Для переменных, которые отличаются максимальной / минимальной длиной более чем на 4 символа (например, в первом столбце), вставьте 2 вкладки вместо одной, например:

for(tuna cars: tuna.values()){
    if (cars.getColor().length() > 5)
        System.out.printf("%s\t%s\t\t%s\n", cars, cars.getColor(), cars.getYear())
    else
        System.out.printf("%s\t\t%s\t\t%s\n", cars, cars.getColor(), cars.getYear())

ОБНОВЛЕНИЕ Исправлено только для выводадве вкладки, где цвет не слишком длинный.

...