52

我想将双引号附加到数组中的字符串,然后将它们作为单个字符串加入(保留引号)。是否有任何字符串库可以做到这一点?我已经尝试过 Apache commons StringUtils.join 和 Google guava 中的 Joiner 类,但找不到任何附加双引号的东西。

我的输入将是一个数组,如下所述:

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

所需的输出应如下所述:

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

我知道我可以遍历数组并附加引号。但如果有的话,我想要一个更清洁的解决方案。

4

7 回答 7

131

使用 Java 8+

Java 8 具有Collectors.joining()及其重载。它也有String.join

使用一个Stream和一个Collector

幼稚但有效的方法

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

最短且性能可能更好(虽然有点骇人听闻)

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

使用String.join

非常骇人听闻。不要使用。(但必须提到)

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

使用旧版本的 Java

帮自己一个忙,使用图书馆。番石榴立刻浮现在脑海中。

使用番石榴

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是 aList<String>而不是 a String[]。您可以将 aString[]转换为List<String>using Arrays.asList(strings)。您可以Stream<String>直接从String[]using中获取 a Arrays.stream(strings)
  • Java 8+ 代码片段使用+连接,因为此时+通常比StringBuilder.
  • 旧版本的代码片段使用StringBuilder而不是+因为它通常在旧版本上更快。
于 2013-08-14T10:21:30.540 回答
12
String output = "\"" + StringUtils.join(listOfStrings , "\",\"") + "\"";
于 2013-11-28T08:54:52.980 回答
2

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

"\"" + Joiner.on("\",\"").join(values) + "\""
于 2016-10-14T20:44:11.620 回答
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);
}

输出:“day”、“campaign”、“imps”、“conversions”

于 2013-08-14T09:36:45.903 回答
0

您也可以自己为此功能创建代码:

String output = "";

for (int i = 0; i < listOfStrings.length; i++)
{
    listOfStrings[i] = "\"" + listOfStrings[i] + "\"";
    output += listOfStrings[i] + ", ";
}
于 2013-08-14T09:31:57.130 回答
0

更通用的方式是 sth。喜欢:

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()));
}
于 2014-08-29T12:28:16.063 回答
0

JDK 中没有可以做到这一点的方法,但是您可以使用Apache Commons Langs StringUtls类,StringUtils.join()它会起作用

于 2013-08-14T09:43:14.207 回答