Java - 给数组中的字符串添加引号并将字符串连接在一起

53

我想在一个数组的字符串后面添加双引号,然后将它们连接成一个字符串(保留引号)。是否有任何可以实现这个功能的字符串库?我尝试过Apache commons StringUtils.join和Google guava中的Joiner类,但没有找到任何可以附加双引号的东西。

我的输入将是以下数组:

String [] listOfStrings = {"day", "campaign", "imps", "conversions"};

所需的输出应按以下方式:

String output = "\"day\", \"campaign\", \"imps\", \"conversions\"";

我知道可以循环遍历数组并添加引号。但如果有更加简洁的解决方案,我希望能够使用它。

7个回答

140

使用 Java 8+

Java 8新增了Collectors.joining()及其重载方法。同时也有String.join方法。

使用 StreamCollector

简洁高效的方式

String wrapWithQuotesAndJoin(List<String> strings) {
  return strings.stream()
    .map(s -> "\"" + s + "\"")
    .collect(Collectors.joining(", "));
}

最短且可能性能更好(虽然有点 hackish)

String wrapWithQuotesAndJoin(List<String> strings) {
  return strings.stream()
    .collect(Collectors.joining("\", \"", "\"", "\""));
}

使用String.join

非常hackish,不建议使用(但必须提到)

String wrapWithQuotesAndJoin(List<String> strings) {
  return strings.isEmpty() ? "" : "\"" + String.join("\", \"", strings) + "\""
}

使用旧版本的Java

给自己一个方便,使用一个库。Guava 是首选。

使用Guava

private static final Function<String,String> addQuotes = new Function<String,String>() {
  @Override public String apply(String s) {
    return new StringBuilder(s.length()+2).append('"').append(s).append('"').toString();
  }
};
String wrapWithQuotesAndJoin(List<String> strings) {     
    return Joiner.on(", ").join(Iterables.transform(listOfStrings, addQuotes));
}

没有库

String wrapWithQuotesAndJoin(List<String> strings) {
  if (listOfStrings.isEmpty()) {
    return "";
  }
  StringBuilder sb = new StringBuilder();
  Iterator<String> it = listOfStrings.iterator();
  sb.append('"').append(it.next()).append('"'); // Not empty
  while (it.hasNext()) {
    sb.append(", \"").append(it.next()).append('"');
  }
  result = sb.toString();
}

注意:

  • 所有的解决方案假定strings是一个List<String>而不是一个String[]。您可以使用Arrays.asList(strings)String[]转换为List<String>。您可以使用Arrays.stream(strings)直接从String[]获取一个Stream<String>
  • Java 8+代码段使用+连接,因为此时+通常比StringBuilder更快。
  • 旧版本的代码段使用StringBuilder而不是+,因为在旧版本中它通常更快。

13
String output = "\"" + StringUtils.join(listOfStrings , "\",\"") + "\"";

参数颠倒了:StringUtils.join("\",\"", listOfStrings) - nmat
如果 listOfStrings 是空的,则打印两个引号 (""),这在某些情况下是不可接受的。 - Ilya Serbis

3

将引号与分隔符一起添加,然后将引号附加到前面和后面。

"\"" + Joiner.on("\",\"").join(values) + "\""

0
一种更通用的方式可能是这样的:
private static class QuoteFunction<F> {
    char quote;

    public QuoteFunction(char quote) {
        super();
        this.quote = quote;
    }

    Function<F, String> func = new Function<F,String>() {
        @Override
        public String apply(F s) {
            return new StringBuilder(s.toString().length()+2).append(quote).append(s).append(quote).toString();
        }
    };

    public Function<F, String> getFunction() {
        return func;
    }
}

...可以通过以下函数调用它

public static <F> String asString(Iterable<F> lst, String delimiter, Character quote) {
    QuoteFunction<F> quoteFunc = new QuoteFunction<F>(quote);
    Joiner joiner = Joiner.on(delimiter).skipNulls();
    return joiner.join(Iterables.transform(lst, quoteFunc.getFunction()));
}

0
你也可以自己编写这个功能的代码:
String output = "";

for (int i = 0; i < listOfStrings.length; i++)
{
    listOfStrings[i] = "\"" + listOfStrings[i] + "\"";
    output += listOfStrings[i] + ", ";
}

0
public static void main(String[] args) {
    // TODO code application logic here
    String [] listOfStrings = {"day", "campaign", "imps", "conversions"};
    String output = "";

    for (int i = 0; i < listOfStrings.length; i++) {
        output += "\"" + listOfStrings[i] + "\"";
        if (i != listOfStrings.length - 1) {
            output += ", ";
        }
    }

    System.out.println(output);
}

输出:"日期","广告系列","曝光次数","转化次数"


StringUtils.join是一个更加简洁的解决方案。我想知道是否有任何库具有追加双引号的功能。 - Anand

0

Himanshu - 我已经在使用StringUtils.join了。我想知道如何将双引号附加到字符串中。对于我的表述不够清晰,我感到抱歉。我会编辑我的帖子。 - Anand

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