Java: konvertiere Liste <String> in einen Stringjava


Answers

Alle Referenzen auf Apache Commons sind in Ordnung (und das ist, was die meisten Menschen verwenden), aber ich denke, die Guava Äquivalent, Joiner , hat eine viel schönere API.

Sie können die einfache Verknüpfung Fall mit machen

Joiner.on(" and ").join(names)

Aber auch leicht mit nulls umgehen:

Joiner.on(" and ").skipNulls().join(names);

oder

Joiner.on(" and ").useForNull("[unknown]").join(names);

Und (nützlich genug, soweit ich mich darum bemühe, es vorzuziehen, Commons-lang), die Fähigkeit, mit Maps umzugehen:

Map<String, Integer> ages = .....;
String foo = Joiner.on(", ").withKeyValueSeparator(" is ").join(ages);
// Outputs:
// Bill is 25, Joe is 30, Betty is 35

Was für das Debugging besonders nützlich ist

Question

JavaScript hat Array.join()

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

Hat Java so etwas? Ich weiß, ich kann mir selbst mit StringBuilder etwas überlegen:

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 gibt keinen Sinn, dies zu tun, wenn so etwas wie ein Teil des JDK ist.




Auf Android kannst du die TextUtils- Klasse verwenden.

TextUtils.join(" and ", names);



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



Ich schrieb dies (ich benutze es für Bohnen und nutzte toString , also nicht schreiben 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();
}

Aber Collection wird nicht von JSP unterstützt, also für TLD schrieb ich:

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 setzen auf .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 benutze es in JSP-Dateien als:

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



Ein orthodoxer Weg, um es zu erreichen, ist durch die Definition einer neuen Funktion:

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

Sample:

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 ~, ~




Java 8 Lösung mit java.util.StringJoiner

Java 8 hat eine StringJoiner Klasse. Aber du musst noch ein bisschen Kesselplatte schreiben, weil es Java ist.

StringJoiner sj = new StringJoiner(" and ", "" , "");
String[] names = {"Bill", "Bob", "Steve"};
for (String name : names) {
   sj.add(name);
}
System.out.println(sj);






Google Guava API hat auch .join (), obwohl (wie sollte mit den anderen Antworten offensichtlich sein), Apache Commons ist so ziemlich der Standard hier.




BEARBEITEN

Ich toString() auch die toString() zugrunde liegende Implementierungsproblematik und über das Element, das den Separator enthält, aber ich dachte, dass ich paranoid war.

Da ich hier zwei Kommentare habe, ändere ich meine Antwort auf:

    static String join( List<String> list , String replacement  ) {
        StringBuilder b = new StringBuilder();
        for( String item: list ) { 
            b.append( replacement ).append( item );
        }
        return b.toString().substring( replacement.length() );
    }

Das sieht der ursprünglichen Frage ziemlich ähnlich aus.

Also, wenn Sie nicht das Gefühl haben, das ganze Glas zu Ihrem Projekt hinzuzufügen, können Sie das verwenden.

Ich denke, es ist nichts falsch mit deinem ursprünglichen Code. Tatsächlich sieht die Alternative, die jeder ankündigt, fast gleich aus (obwohl es eine Reihe von zusätzlichen Validierungen gibt)

Hier ist es, zusammen mit der Apache 2.0 Lizenz.

public static String join(Iterator iterator, String separator) {
       // handle null, zero and one elements before building a buffer
       if (iterator == null) {
           return null;
       }
       if (!iterator.hasNext()) {
           return EMPTY;
       }
       Object first = iterator.next();
       if (!iterator.hasNext()) {
           return ObjectUtils.toString(first);
       }

       // two or more elements
       StringBuffer buf = new StringBuffer(256); // Java default is 16, probably too small
       if (first != null) {
           buf.append(first);
       }

       while (iterator.hasNext()) {
           if (separator != null) {
               buf.append(separator);
           }
           Object obj = iterator.next();
           if (obj != null) {
               buf.append(obj);
           }
       }
       return buf.toString();
   }

Jetzt wissen wir, danke Open Source




Versuche dies:

java.util.Arrays.toString(anArray).replaceAll(", ", ",")
                .replaceFirst("^\\[","").replaceFirst("\\]$","");