Форматирование строкового вывода в Java - PullRequest
0 голосов
/ 10 марта 2011

Я пытаюсь отформатировать строку в выводе иначе, чем она уже отформатирована в моей программе. Это меню ингредиентов для пиццы, и в основной части программы всякий раз, когда оно выводится, оно форматируется с помощью «\ n» между ингредиентами, чтобы создать «ощущение» списка. Тем не менее, в последнем меню, где отображается выбор пользователя, я также хочу добавить список ингредиентов, потому что пользователь может настроить, какие ингредиенты находятся в его пицце. Это сложно с вертикальным списком ингредиентов, потому что он может сделать конечный результат действительно длинным, если у пользователя есть более одной пиццы. Я пытаюсь выяснить, есть ли способ взять ту же строку, которая была отформатирована для вертикального отображения, и отобразить ее горизонтально с запятой между ингредиентами вместо "\ n". Есть идеи? Или мне просто создать новую строку, отформатированную так, как я хочу, с нужной мне информацией?

String i1 = "Pepperoni", i2 = "Sausage", i3 = "Canadian Bacon";
String ingredients = i1 + "\n" + i2 + "\n" + i3 + "\n";
System.out.print(ingredients);
System.out.printf("Your pizza includes only these ingredients: %s", ingredients);

Первый System.out.print (ингридиенты) аналогичен имеющемуся у меня коду, который печатает ингредиенты по вертикали по всей программе, так что он легко читается пользователем.

Второй System.out.print (...) - это то, что я пытаюсь отформатировать, чтобы список ингредиентов отображался горизонтально.

Ответы [ 4 ]

1 голос
/ 10 марта 2011
String s = "hi\nthere";
s.replaceAll("\n", ","); // (returns "hi,there")

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String)

1 голос
/ 10 марта 2011

Я бы подумал, что это было бы понятнее:

String i1 = "Pepperoni", i2 = "Sausage", i3 = "Canadian Bacon";
System.out.printf("%s\n%s\n%s\n", i1, i2, i3);
System.out.printf("Your pizza includes ingredients: %s %s %s", i1, i2, i3);

Дело в том, что если вы вообще собираетесь использовать printf, вы также можете использовать его способность присоединяться к строкам.вместе.


Из вашего комментария я понимаю, что количество ингредиентов является переменным.Если это так, то использование printf для форматирования «списка» (как я делал выше) не приведет к его сокращению.Вместо этого вам нужен вспомогательный метод, подобный следующему:

public static String join(String separator, Object[] things) {
    StringBuilder sb = new StringBuilder();
    for (Object thing : things) {
        if (sb.length() > 0) {
            sb.append(separator);
        }
        sb.append(thing);
    }
    return sb.toString();
}

Затем ...

Object[] ingredients = new Object[]{i1, i2, i3}; // ... or a dynamic sided array
System.out.print(join("\n", ingredients));
System.out.println("Your pizza includes ingredients: " + join(" ", ingredients));

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

(вспомогательный метод join существует в различных формах в ряде библиотек классов; например, в классе Apache Commons StringUtils.)

1 голос
/ 10 марта 2011
String i1 = "Pepperoni", i2 = "Sausage", i3 = "Canadian Bacon";
String ingredients = i1 + "\n" + i2 + "\n" + i3;
System.out.println(ingredients);
System.out.println("Your pizza includes only these ingredients: " + ingredients.replace("\n", ", ")
0 голосов
/ 10 марта 2011

замена \ n на, это стиль новичка и скоро вернется, чтобы укусить вас.попробуйте это вместо запятой (и выполните \ n часть вручную, как вы уже делаете):

String [] ingredients = {"Pepperoni", "Sausage", "Canadian Bacon"};
String almost_there = Arrays.deepToString(ingredients);
String there = almost_there.substring(1, almost_there.length() - 1);
System.out.printf("Your pizza includes ingredients: ", there);
...