2015-05-25 2 views
2

У меня есть список строк, которые я хочу отформатировать каждый из них таким же образом. например myListOfStrings = str1, str2, str3, и мой формат (% s) Я хочу иметь что-то вроде этого:Как форматировать список строк в

String.format(" (%s) ", myListOfStrings) 

Выведет

(str1) (str2) (str3) 

Есть элегантный способ сделать это? или мне нужно использовать построитель строк и сделать цикл foreach на всех строках?

+1

Вы используете Java 8? – Maroun

+1

Ну, StringBuilder кажется очевидным, можете ли вы привести пример кода (используя SB), чтобы мы лучше поняли, что вы имеете в виду, пожалуйста. –

+0

Вы можете использовать StringBuilder (если вы не хотите, чтобы потокобезопасность) или использовать буфер строки –

ответ

5

Вы можете сделать это с помощью Java 8:

import static java.util.stream.Collectors.joining; 

public static void main(String[] args) throws Exception { 

    final List<String> strings = Arrays.asList("a", "b", "c"); 

    final String joined = strings.stream() 
      .collect(joining(") (", "(", ")")); 

    System.out.println(joined); 
} 

Или:

final String joined = strings.stream() 
     .map(item -> "(" + item + ")") 
     .collect(joining(" ")); 

Какой вы предпочитаете это вопрос личных предпочтений.

Первый соединяет пункты ) (, который дает:

а) (б) (

Затем вы используете префикс и суффикс аргументы joining к с префиксом с ( и суффикса с ), чтобы производить правильный результат.

Вторая альтернатива преобразует каждый элемент в (+ item +), а затем присоединяется к ним на «».

Th e сначала также может быть несколько быстрее, так как требуется только создание StringBuilder экземпляр - как для соединения, так и для префикса/суффикса. Второй вариант требует создания n + 1StringBuilder экземпляров, по одному для каждого элемента, а один для соединения на "".

0
String strOut = ""; 
for(int i=0; i< myListOfStrings.size(); i++){ 
    strOut = strOut +"("+myListOfStrings.get(i)+")"; 
} 
+1

Не могли бы вы [изменить] ваш ответ, чтобы дать объяснение, почему этот код отвечает на вопрос? Ответы только на код [обескуражены] (http://meta.stackexchange.com/questions/148272), потому что они не учат решению. – DavidPostill

1

Вы можете попробовать это:

List<String> list = new ArrayList<String>(); 
list.add("str1"); 
list.add("str2"); 
list.add("str3"); 

for(String s : list) { 
    System.out.println(String.format(" (%s) ", s)); 
} 
1

если вы хотите раствор одной строки, вы можете использовать один из самых StringUtils.join методов в Apache Commons Lang.

String result = "(" + StringUtils.join(myListOfStrings, ") (") + ")"; 
0

Использование Java8 новый метод forEach для итерация коллекций:

public static String format(List<String> list) { 
    StringBuilder sb = new StringBuilder(); 
    list.forEach(x -> sb.append(String.format(" (%s) ", x))); 
    return sb.toString(); 
} 

Попробуйте здесь: https://ideone.com/52EKRH

+0

Eugh - Мне это совсем не нравится. Он смешивает форматирование с выходом очень уродливым способом. Это также должно быть, вероятно, 'printf', а не как' format', так и 'print'. Или используйте «карту», ​​затем «печать». В любом случае, я думаю, что это не очень хороший подход. –

+0

@BoristheSpider (соглашайтесь с printf, еще), это гораздо более читаемо, чем как поток/карта/собирать, так и соединяющие формы –

+0

@BoristheSpider вы когда-нибудь использовали регистратор? –

0

Борис ответ паука является то, что я хотел бы пойти с, но в случае, если вы не используя java 8, но, возможно, вы используете Guava, вы можете сделать что-то вроде этого, хотя это немного подробное:

Joiner.on("").join(Collections2.transform(myListOfStrings, new Function<String, String>() { 

     @Override 
     public String apply(String input) { 
      return String.format(" (%s) ", input); 
     } 
    })); 
+0

Это похоже на мою вторую альтернативу, которая менее эффективна. Кроме того, это не похоже на то, что OP хочет, чтобы выход был предварительно/суффикс с пробелами - вы должны присоединиться к пробелу, как в моем коде. –

Смежные вопросы