Выровняйте все строки правильно, используя String.format java - PullRequest
0 голосов
/ 29 сентября 2019

Я создаю файл, добавляя все строки в StringBuilder и затем выгружая его в файл.Но когда я проверяю файл (что очевидно), все мои строки в каждой строке не выровнены должным образом.

Ниже приведен код, вызываемый верхним уровнем, передавая все необходимые данные.

  private static StringBuilder appendStrings(String pro, List<ProcConfig> list,
      StringBuilder sb) {
    for (ProcConfig pc : list) {
      sb.append(pro).append(" ").append(pc.getNo()).append(" ").append(pc.getId())
          .append(" ").append(pc.getAddress()).append(" ").append(pc.getPort()).append(" ")
          .append(pc.getNumPorts()).append(" ").append(pc.getName())
          .append(System.getProperty("line.separator"));
    }
    sb.append(System.getProperty("line.separator"));
    return sb;
  }

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

config 51 106 10.178.151.25 8095 5 tyt_87612nsas_woqa_7y2_0
config 51 104 10.124.192.124 8080 5 tyt_abc_pz1_rn03c-7vb_01

if_hello_abc_tree tyt.* then process_is_not_necessary 32 80 10.86.25.29 9091 5 tyt_goldenuserappslc22
if_hello_abc_tree tyt.* then process_is_not_necessary 51 50 10.174.192.209 9091 5 tyt_goldenuserapprno01

if_hello_abc_tree tyt.* then config 4 140 10.914.198.26 10001 1 silos_lvskafka-1702600
if_hello_abc_tree tyt.* then config 4 184 10.444.289.138 10001 1 silos_lvskafka-1887568

Можно ли как-нибудь правильно выровнять каждую из вышеуказанных линий?Таким образом, вывод должен быть таким:

config 51 106 10.178.151.25  8095 5 tyt_87612nsas_woqa_7y2_0
config 51 104 10.124.192.124 8080 5 tyt_abc_pz1_rn03c-7vb_01

if_hello_abc_tree tyt.* then process_is_not_necessary 32 80 10.86.25.29    9091 5 tyt_goldenuserappslc22
if_hello_abc_tree tyt.* then process_is_not_necessary 51 50 10.174.192.209 9091 5 tyt_goldenuserapprno01

if_hello_abc_tree tyt.* then config 4 140 10.914.198.26  10001 1 silos_lvskafka-1702600
if_hello_abc_tree tyt.* then config 4 184 10.444.289.138 10001 1 silos_lvskafka-1887568

Обновление:

Ниже показано, как он генерируется сейчас.Как вы можете видеть на IP-адресе, если вы сравните две строки, это немного не так.

config 51 106   97.143.765.65 8095 5 abc_tyewaz1_rna03c-7nhl_02 
config 51 104  97.143.162.184 8080 5 abc_tyewaz1_rna03c-7vjb_01 

Вместо этого мы можем сгенерировать, как показано ниже?В основном делает каждый столбец прямым.Возможно ли это сделать?

config 51 106  97.143.765.65  8095 5 abc_tyewaz1_rna03c-7nhl_02 
config 51 104  97.143.162.184 8080 5 abc_tyewaz1_rna03c-7vjb_01 

1 Ответ

1 голос
/ 29 сентября 2019

Прежде всего: я не Java-разработчик, но я немного знаю об этом.Я знаю, что это не лучший способ решить вашу проблему, но вы поймете, что вам нужно.

Вместо многократного вызова метода добавления, используйте Formatter и просматривайте его так:

private static StringBuilder appendStrings(String pro, List<ProcConfig> list, StringBuilder sb) {
    Formatter formatter = new Formatter(sb);
    String template ="";
    for (ProcConfig pc : list) {
        if (pro.length() == 6)
            template = "%-6s %d %3d %-15s %d %d %s %n";
        else if (pro.length() > 35)
            template = "%-53s %d %3d %-15s %d %d %s %n";
        else
            template = "%-35s %d %3d %-15s %d %d %s %n";
        formatter.format(template, pro, pc.getNo(), pc.getId(), pc.getAddress(), pc.getPort(), pc.getNumPorts(), pc.getName());
    }
    formatter.close();
    return sb;
}

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

Примечание : не забудьте импортировать java.util.Formatter .

Вы можете использовать спецификаторы формата, чтобы указать способ форматирования данных.Вот список распространенных форматеров:

%S or %s: Specifies String
%X or %x: Specifies hexadecimal integer
%o: Specifies Octal integer
%d: Specifies Decimal integer
%c: Specifies character
%T or %t: Specifies Time and date
%n: Inserts newline character
%B or %b: Specifies Boolean
%A or %a: Specifies floating point hexadecimal
%f: Specifies Decimal floating point

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

Чтобы узнать больше о форматере, взгляните на здесь и здесь .

...