如何将字符串列表格式化为特定形式的字符串

11

我有一个字符串列表,我想以相同的方式格式化每个字符串,例如:myListOfStrings = str1,str2,str3,我的格式是(%s) 我想要像这样的东西:

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

将输出

(str1)  (str2)  (str3)

有没有一种优雅的方法来做到这一点?或者我必须使用字符串构建器并在所有字符串上进行foreach循环吗?


1
你正在使用Java 8吗? - Maroun
1
StringBuilder似乎很明显,你能提供一些使用它的代码示例让我们更好地理解你的意思吗?谢谢。 - user813853
你可以使用 StringBuilder(如果你不需要线程安全)或者使用 StringBuffer。 - nilesh virkar
你不能为你的列表创建一个包装类吗? - Olimpiu POP
6个回答

15
你可以使用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

然后使用前缀和后缀参数来将前缀设为 ( 以及后缀设为 ),以产生正确的结果。

第二种方法将每个项目转换为 ( + item + ),然后在 " " 上将它们连接起来。

第一种方法可能会更快一些,因为它只需要创建一个 StringBuilder 实例——用于连接和前缀/后缀。而第二种方法需要创建 n + 1StringBuilder 实例,一个用于每个元素,另一个用于连接 " "。


5

如果您想要一行代码的解决方案,您可以使用Apache Commons Lang中StringUtils.join方法之一。

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

1
你可以尝试这个:

List<String> list = new ArrayList<String>();
list.add("str1");
list.add("str2");
list.add("str3");
        
for(String s : list) {
  System.out.print(String.format(" (%s) ", s));
}

这里运行了三个单独的打印语句,看起来OP只需要一个打印语句。 - Ethan Conner

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

1
请您编辑一下您的答案,解释一下为什么这段代码可以回答问题。仅有代码的答案是不被鼓励的,因为它们无法教授解决方案。 - DavidPostill

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


呃 - 我一点也不喜欢这个。它以非常丑陋的方式混合了格式和输出。它也应该使用 printf 而不是同时使用 formatprint。或者使用一个 map 然后再用 print。无论哪种方式,我认为这都不是一个好的方法。 - Boris the Spider
@BoristheSpider(同意printf,但是-)它比流/映射/收集和连接形式更易读。 - guido
@BoristheSpider 你有使用过日志记录器吗? - guido
记录日志是为了调试而不是业务逻辑。 - Boris the Spider
你的新代码好多了,但我认为如果你有一个 StringBuilder 就应该使用它 - 完全跳过 format 和它的开销... - Boris the Spider
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - guido

0

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);
        }
    }));

这与我的第二个选择相似,但效率较低。此外,看起来 OP 不希望输出以空格为前/后缀 - 您应该像我在代码中所做的那样使用空格连接。 - Boris the Spider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接