Java-dołączanie cudzysłowów do łańcuchów w tablicy i łączenie łańcuchów w tablicy

Chciałbym dodać podwójne cudzysłowy do łańcuchów w tablicy, a następnie połączyć je jako pojedynczy łańcuch (zachowując cudzysłowy). Czy jest jakaś Biblioteka ciągów, która to robi? Próbowałem Apache commons StringUtils.Dołącz i klasa Joiner w Google guava, ale nie mógł znaleźć niczego, co dołącza podwójne cudzysłowy.

Moje wejście będzie tablicą jak wspomniano poniżej:

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

Wymagane wyjście powinno być wymienione poniżej:

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

I know I can loop through the array and Dołącz cytaty. Ale chciałbym bardziej czystsze rozwiązanie, jeśli istnieje.

Author: Sean Patrick Floyd, 2013-08-14

7 answers

Z Java 8 +

Java 8 mA Collectors.joining() i jego przeciążenia. Posiada również String.join.

Using a Stream and a Collector

Z funkcją wielokrotnego użytku

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

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

BEZ funkcji wielokrotnego użytku

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

Najkrótsza (choć nieco hakerska)

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

Za pomocą String.join

Bardzo hakerskie. Nie używać z wyjątkiem metody o nazwie wrapWithQuotesAndJoin.
String result = listOfString.isEmpty() ? "" : "\"" + String.join("\", \"", listOfStrings) + "\"";

Ze starszymi wersjami Java

Wyświadcz sobie przysługę i skorzystaj z biblioteki. Od razu przychodzi mi na myśl guawa.

Używanie Guawy

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));

Brak bibliotek

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

Uwaga : wszystkie rozwiązania zakładają, że listOfStrings jest List<String>, a nie String[]. Możesz przekonwertować String[] na List<String> za pomocą Arrays.asList(arrayOfStrings). Możesz uzyskać Stream<String> bezpośrednio z String[] za pomocą Arrays.stream(arrayOfString).

 65
Author: Olivier Grégoire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-18 11:37:25
String output = "\"" + StringUtils.join(listOfStrings , "\",\"") + "\"";
 8
Author: Sifeng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-26 08:59:34

Dodaj cytaty wraz z separatorem, a następnie dodaj cytaty z przodu iz tyłu.

"\"" + Joiner.on("\",\"").join(values) + "\""
 2
Author: Kevin Peterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 21:14:33

Możesz również utworzyć kod dla tej funkcjonalności:

String output = "";

for (int i = 0; i < listOfStrings.length; i++)
{
    listOfStrings[i] = "\"" + listOfStrings[i] + "\"";
    output += listOfStrings[i] + ", ";
}
 0
Author: bas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-14 09:31:57
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);
}

Output: "day"," campaign"," imps","conversions"

 0
Author: Sommes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-14 09:36:45

W JDK nie ma metody, która mogłaby to zrobić, ale możesz użyć Apache Commons Langs StringUtls class, StringUtils.join() it will work

 0
Author: Himanshu Mishra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-14 09:43:14

Bardziej ogólnym sposobem byłoby sth. like:

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;
    }
}

... wywołaj go za pomocą następującej funkcji

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
Author: John Rumpel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 12:28:16