如何将字符串列表格式化为
How to format a list of strings into
我有一个字符串列表,我想以相同的方式对每个字符串进行格式化。例如myListOfStrings = str1, str2, str3,我的格式是 (%s)
我想要这样的东西:
String.format(" (%s) ", myListOfStrings)
会输出
(str1) (str2) (str3)
有没有一种优雅的方式来做到这一点?还是我必须使用字符串生成器并对所有字符串执行 foreach 循环?
String strOut = "";
for(int i=0; i< myListOfStrings.size(); i++){
strOut = strOut +"("+myListOfStrings.get(i)+")";
}
你可以用 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(" "));
你更喜欢哪一个是个人喜好问题。
第一个加入 ) (
上的项目,给出:
a) (b) (c
然后使用 joining
的前缀和后缀参数,前缀为 (
,后缀为 )
,以产生正确的结果。
第二种选择将每个项目转换为 ( + item + )
,然后将它们加入“ ”。
第一个也可能稍微快一些,因为它只需要为连接和 pre/suffix 创建 一个 StringBuilder
实例。第二种选择需要创建 n + 1 StringBuilder
个实例,一个用于每个元素,一个用于连接 " "。
你可以试试这个:
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));
}
如果您想要一个单行解决方案,您可以使用 Apache Commons Lang 中的 StringUtils.join 方法之一。
String result = "(" + StringUtils.join(myListOfStrings, ") (") + ")";
使用 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();
}
Boris The Spider 的回答是我愿意接受的,但如果你没有使用 java 8,但也许你正在使用 Guava,你可以这样做,尽管它有点冗长:
Joiner.on("").join(Collections2.transform(myListOfStrings, new Function<String, String>() {
@Override
public String apply(String input) {
return String.format(" (%s) ", input);
}
}));
我有一个字符串列表,我想以相同的方式对每个字符串进行格式化。例如myListOfStrings = str1, str2, str3,我的格式是 (%s) 我想要这样的东西:
String.format(" (%s) ", myListOfStrings)
会输出
(str1) (str2) (str3)
有没有一种优雅的方式来做到这一点?还是我必须使用字符串生成器并对所有字符串执行 foreach 循环?
String strOut = "";
for(int i=0; i< myListOfStrings.size(); i++){
strOut = strOut +"("+myListOfStrings.get(i)+")";
}
你可以用 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(" "));
你更喜欢哪一个是个人喜好问题。
第一个加入 ) (
上的项目,给出:
a) (b) (c
然后使用 joining
的前缀和后缀参数,前缀为 (
,后缀为 )
,以产生正确的结果。
第二种选择将每个项目转换为 ( + item + )
,然后将它们加入“ ”。
第一个也可能稍微快一些,因为它只需要为连接和 pre/suffix 创建 一个 StringBuilder
实例。第二种选择需要创建 n + 1 StringBuilder
个实例,一个用于每个元素,一个用于连接 " "。
你可以试试这个:
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));
}
如果您想要一个单行解决方案,您可以使用 Apache Commons Lang 中的 StringUtils.join 方法之一。
String result = "(" + StringUtils.join(myListOfStrings, ") (") + ")";
使用 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();
}
Boris The Spider 的回答是我愿意接受的,但如果你没有使用 java 8,但也许你正在使用 Guava,你可以这样做,尽管它有点冗长:
Joiner.on("").join(Collections2.transform(myListOfStrings, new Function<String, String>() {
@Override
public String apply(String input) {
return String.format(" (%s) ", input);
}
}));