Java - 将引号附加到数组中的字符串并连接数组中的字符串

时间:2013-08-14 09:28:57

标签: java guava apache-commons

我想将双引号附加到数组中的字符串,然后将它们作为单个字符串连接(保留引号)。有没有这样做的字符串库?我在Google番石榴中尝试过Apache commons StringUtils.join和Joiner类,但找不到附加双引号的内容。

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

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

所需的输出应如下所述:

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

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

7 个答案:

答案 0 :(得分:87)

使用Java 8 +

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

使用StreamCollector

具有可重复使用的功能

Function<String,String> addQuotes = s -> "\"" + s + "\"";

String result = listOfStrings.stream()
  .map(addQuotes)
  .collect(Collectors.joining(", "));

没有任何可重复使用的功能

String result = listOfStrings.stream()
  .map(s -> "\"" + s + "\"")
  .collect(Collectors.joining(", "));

最短(虽然有点hackish)

String result = listOfStrings.stream()
  .collect(Collectors.joining("\", \"", "\"", "\""));

使用String.join

非常hackish。请勿在名为wrapWithQuotesAndJoin的方法中使用。

String result = listOfString.isEmpty() ? "" : "\"" + String.join("\", \"", listOfStrings) + "\"";

使用旧版本的Java

帮自己一个忙,并使用图书馆。我会立刻想到Guava

使用番石榴

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 result = Joiner.on(", ").join(Iterables.transform(listOfStrings, addQuotes));

没有图书馆

String result;
if (listOfStrings.isEmpty()) {
  result = "";
} else {
  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();
}

注意:所有解决方案都假定listOfStringsList<String>而不是String[]。您可以使用String[]List<String>转换为Arrays.asList(arrayOfStrings)。您可以使用Stream<String>直接从String[]获取Arrays.stream(arrayOfString)

答案 1 :(得分:9)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

String output = "";

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

答案 4 :(得分: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”

答案 5 :(得分:0)

JDK中没有可以执行此操作的方法,但您可以使用Apache Commons Langs StringUtls类,StringUtils.join()它将起作用

答案 6 :(得分: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()));
}