739 Stimmen

Java: Umwandlung von List<String> in einen join()d String

JavaScript hat Array.join()

js>["Bill","Bob","Steve"].join(" and ")
Bill and Bob and Steve

Gibt es so etwas auch in Java? Ich weiß, dass ich selbst etwas zusammenschustern kann mit StringBuilder :

static public String join(List<String> list, String conjunction)
{
   StringBuilder sb = new StringBuilder();
   boolean first = true;
   for (String item : list)
   {
      if (first)
         first = false;
      else
         sb.append(conjunction);
      sb.append(item);
   }
   return sb.toString();
}

aber es hat keinen Sinn, dies zu tun, wenn so etwas bereits Teil des JDK ist.

1 Stimmen

Siehe auch diese Frage für Listen

20 Stimmen

Nicht streng verwandt, aber Android hat eine eingebaute Join-Funktion als Teil ihrer TextUtils-Klasse: [developer.Android.com/reference/Android/text/](http://developer.android.com/reference/android/text/TextUtils.html#join(java.lang.CharSequence) , java.lang.Iterable)

18 Stimmen

Java 8 hat eine String.join() Methode. Werfen Sie einen Blick auf diese Antwort, wenn Sie Java 8 (oder neuer) verwenden stackoverflow.com/a/22577565/1115554

49voto

amra Punkte 14794

Drei Möglichkeiten in Java 8:

List<String> list = Arrays.asList("Alice", "Bob", "Charlie")

String result = String.join(" and ", list);

result = list.stream().collect(Collectors.joining(" and "));

result = list.stream().reduce((t, u) -> t + " and " + u).orElse("");

30voto

aifa Punkte 524

Mit einem Java 8-Kollektor kann dies mit folgendem Code geschehen:

Arrays.asList("Bill", "Bob", "Steve").stream()
.collect(Collectors.joining(" and "));

Außerdem ist die einfachste Lösung in Java 8:

String.join(" and ", "Bill", "Bob", "Steve");

oder

String.join(" and ", Arrays.asList("Bill", "Bob", "Steve"));

25voto

gavenkoa Punkte 40749

Ich habe das hier geschrieben (ich verwende es für Bohnen und Ausbeutung toString also schreiben Sie nicht Collection<String> ) :

public static String join(Collection<?> col, String delim) {
    StringBuilder sb = new StringBuilder();
    Iterator<?> iter = col.iterator();
    if (iter.hasNext())
        sb.append(iter.next().toString());
    while (iter.hasNext()) {
        sb.append(delim);
        sb.append(iter.next().toString());
    }
    return sb.toString();
}

sondern Collection wird von JSP nicht unterstützt, also habe ich für TLD geschrieben:

public static String join(List<?> list, String delim) {
    int len = list.size();
    if (len == 0)
        return "";
    StringBuilder sb = new StringBuilder(list.get(0).toString());
    for (int i = 1; i < len; i++) {
        sb.append(delim);
        sb.append(list.get(i).toString());
    }
    return sb.toString();
}

und an .tld Datei:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
    <function>
        <name>join</name>
        <function-class>com.core.util.ReportUtil</function-class>
        <function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
    </function>
</taglib>

und verwenden sie in JSP-Dateien als:

<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}

2 Stimmen

Vorschlagen zu ändern Collection<> à Iterable<> ?

0 Stimmen

@JasonS +1. Guter Punkt, aber lesen Sie stackoverflow.com/questions/1159797/

20voto

Juha Syrjälä Punkte 32085

Code, den Sie haben, ist der richtige Weg, um es zu tun, wenn Sie mit JDK ohne externe Bibliotheken tun wollen. Es gibt keinen einfachen "Einzeiler", den Sie in JDK verwenden könnten.

Wenn Sie externe Bibliotheken verwenden können, empfehle ich, dass Sie sich mit org.apache.commons.lang.StringUtils Klasse in der Apache-Commons-Bibliothek.

Ein Beispiel für die Verwendung:

List<String> list = Arrays.asList("Bill", "Bob", "Steve");
String joinedResult = StringUtils.join(list, " and ");

17voto

Daniel De León Punkte 12365

Ein orthodoxer Weg, dies zu erreichen, ist die Definition einer neuen Funktion:

public static String join(String joinStr, String... strings) {
    if (strings == null || strings.length == 0) {
        return "";
    } else if (strings.length == 1) {
        return strings[0];
    } else {
        StringBuilder sb = new StringBuilder(strings.length * 1 + strings[0].length());
        sb.append(strings[0]);
        for (int i = 1; i < strings.length; i++) {
            sb.append(joinStr).append(strings[i]);
        }
        return sb.toString();
    }
}

Beispiel:

String[] array = new String[] { "7, 7, 7", "Bill", "Bob", "Steve",
        "[Bill]", "1,2,3", "Apple ][","~,~" };

String joined;
joined = join(" and ","7, 7, 7", "Bill", "Bob", "Steve", "[Bill]", "1,2,3", "Apple ][","~,~");
joined = join(" and ", array); // same result

System.out.println(joined);

Ausgabe:

7, 7, 7 und Bill und Bob und Steve und [Bill] und 1,2,3 und Apple ][ und ~,~

5 Stimmen

Einem Methodenparameter den gleichen Namen wie der Methode selbst zu geben, ist wahrscheinlich nicht die beste Idee. separator wäre viel aussagekräftiger.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X