597 Stimmen

Ein schneller und einfacher Weg, Array-Elemente mit einem Trennzeichen zu verbinden (das Gegenteil von Split) in Java

参照 Verwandte .NET-Fragen

Ich suche nach einer schnellen und einfachen Möglichkeit, genau das Gegenteil von Split zu tun zu tun, so dass es zu ["a","b","c"] zu werden "a,b,c"

Das Iterieren durch ein Array erfordert entweder das Hinzufügen einer Bedingung (wenn dies nicht das letzte Element ist, füge das Trennzeichen hinzu) oder die Verwendung von substring, um das letzte Trennzeichen zu entfernen.

Ich bin sicher, es gibt einen zertifizierten, effizienten Weg, dies zu tun (Apache Commons?)

Wie gehen Sie bei Ihren Projekten vor?

35voto

eivindw Punkte 1839

Mit Java 1.8 gibt es eine neue StringJoiner-Klasse - also keine Notwendigkeit für Guava oder Apache Commons:

String str = new StringJoiner(",").add("a").add("b").add("c").toString();

Oder Sie verwenden eine Sammlung direkt mit der neuen Stream-Api:

String str = Arrays.asList("a", "b", "c").stream().collect(Collectors.joining(","));

32voto

Roland Bouman Punkte 29957

"Ich bin sicher, es gibt einen zertifizierten, effizienten Weg, dies zu tun (Apache Commons?)"

ja, offensichtlich ist es

StringUtils.join(array, separator)

http://www.java2s.com/Code/JavaAPI/org.apache.commons.lang/StringUtilsjoinObjectarrayStringseparator.htm

22voto

alexm Punkte 1237

Noch einfacher ist es, wenn Sie einfach Arrays verwenden, dann erhalten Sie einen String mit den Werten des Arrays, getrennt durch ein ","

String concat = Arrays.toString(myArray);

Sie erhalten also folgendes Ergebnis: concat = "[a,b,c]"

Update

Sie können dann die Klammern mit einem Substring loswerden, wie von Jeff vorgeschlagen

concat = concat.substring(1, concat.length() -1);

Das Ergebnis ist also concat = "a,b,c".

wenn Sie Kotlin verwenden möchten:

 val concat = myArray.joinToString(separator = ",") //"a,b,c"

17voto

wadjakman Punkte 391

Sie können replace und replaceAll mit regulären Ausdrücken verwenden.

String[] strings = {"a", "b", "c"};

String result = Arrays.asList(strings).toString().replaceAll("(^\\[|\\]$)", "").replace(", ", ",");

Denn Arrays.asList().toString() produziert: "[a, b, c]", wir machen a replaceAll um die erste und die letzte Klammer zu entfernen, und dann (optional) können Sie die ","-Sequenz durch "," (Ihr neues Trennzeichen) ersetzen.

Eine gekürzte Version (weniger Zeichen):

String[] strings = {"a", "b", "c"};

String result = ("" + Arrays.asList(strings)).replaceAll("(^.|.$)", "").replace(", ", "," );

Reguläre Ausdrücke sind sehr leistungsfähig, insbesondere die String-Methoden "replaceFirst" und "replaceAll". Probieren Sie sie aus.

9voto

Ajax Punkte 2370

Alle diese anderen Antworten enthalten Laufzeit-Overhead... wie mit ArrayList.toString().replaceAll(...) die sehr verschwenderisch sind.

Ich werde Ihnen den optimalen Algorithmus mit Null-Overhead geben; er sieht nicht so hübsch aus wie die anderen Optionen, aber intern ist es das, was sie alle tun (nach einem Haufen anderer versteckter Überprüfungen, mehrfacher Array-Allokation und anderem Unfug).

Da Sie bereits wissen, dass Sie es mit Zeichenketten zu tun haben, können Sie eine Reihe von Array-Zuweisungen einsparen, indem Sie alles manuell ausführen. Das ist nicht schön, aber wenn Sie die tatsächlichen Methodenaufrufe der anderen Implementierungen verfolgen, werden Sie sehen, dass es den geringstmöglichen Laufzeit-Overhead hat.

public static String join(String separator, String ... values) {
  if (values.length==0)return "";//need at least one element
  //all string operations use a new array, so minimize all calls possible
  char[] sep = separator.toCharArray();

  // determine final size and normalize nulls
  int totalSize = (values.length - 1) * sep.length;// separator size
  for (int i = 0; i < values.length; i++) {
    if (values[i] == null)
      values[i] = "";
    else
      totalSize += values[i].length();
  }

  //exact size; no bounds checks or resizes
  char[] joined = new char[totalSize];
  int pos = 0;
  //note, we are iterating all the elements except the last one
  for (int i = 0, end = values.length-1; i < end; i++) {
    System.arraycopy(values[i].toCharArray(), 0, 
      joined, pos, values[i].length());
    pos += values[i].length();
    System.arraycopy(sep, 0, joined, pos, sep.length);
    pos += sep.length;
  }
  //now, add the last element; 
  //this is why we checked values.length == 0 off the hop
  System.arraycopy(values[values.length-1].toCharArray(), 0,
    joined, pos, values[values.length-1].length());

  return new String(joined);
}

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