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ます。

aStreamと a の使用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すべてのソリューションは、それがList<String>ではなく であると想定していString[]ます。を使用String[]してを に変換できます。を使用してから直接取得できます。List<String>Arrays.asList(strings)Stream<String>String[]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

より一般的な方法は 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 に答える