web-dev-qa-db-ja.com

Java-配列内の文字列に引用符を追加し、配列内の文字列を結合する

配列内の文字列に二重引用符を追加し、後でそれらを単一の文字列として結合します(引用符を保持)。これを行う文字列ライブラリはありますか? Apache commons StringUtils.joinとGoogle guavaのJoinerクラスを試しましたが、二重引用符を追加するものが見つかりませんでした。

私の入力は、次のように配列になります。

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

必要な出力は次のとおりです。

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

配列をループして引用符を追加できることを知っています。しかし、もしあればもっときれいなソリューションが欲しいです。

37
Anand

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(", "));
_

Shortest(ややハックですが)

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

_String.join_を使用する

非常にハック。 wrapWithQuotesAndJoinというメソッド以外では使用しないでください。

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

古いバージョンのJavaで

あなた自身を支持し、ライブラリを使用してください。 グアバ はすぐに思い浮かびます。

グアバの使用

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

:すべてのソリューションは、listOfStringsが_List<String>_ではなく_String[]_であると想定しています。 Arrays.asList(arrayOfStrings)を使用して、_String[]_を_List<String>_に変換できます。 Arrays.stream(arrayOfString)を使用して、_Stream<String>_から_String[]_を直接取得できます。

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

区切り記号とともに引用符を追加し、前後に引用符を追加します。

"\"" + Joiner.on("\",\"").join(values) + "\""
2
Kevin Peterson

この機能のコードも自分で作成できます。

String output = "";

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

より一般的な方法は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()));
}
0
John Rumpel

JDKにはこれを実行できるメソッドはありませんが、 Apache Commons LangsStringUtls class、StringUtils.join()を使用できます。

0
Himanshu Mishra
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」

0
Sommes