# Problem mit der String.split()



## vodn7v (20. Mrz 2009)

hallo, ich habe ein problem und ich hoffe ihr kenn die lösung. ich benutze, um einen string zu teilen die funktion .split(). funktioniert soweit auch ganz passabel. habe nur ein problem.

Beispiel:
[HIGHLIGHT="Java"]String Line1 = "12345678;A";
String Line2 = "87654321;B";
String Line3 = "22222222;";[/HIGHLIGHT]
Ich splitte die strings und lasse packe die daten in ein array. 
line1 wäre dann  die arraygröße 2 mit werten [0] == 12345678 und [1] == 87654321.
bei line 2 genauso.
problem ist jetzt line 3 . ich bekomme da nur eine arraygröße von 1 mit dem ersten wert.mölchte aber auch die größe 2 haben und halt auf [0] = 22222222 und auf [1] = "" einfach einen leeren string.

da ich die daten vergleichen möchte brauch ich das so. habt ihr eine idee wie ich sowas lösen kann?
es kann auch sein, dass solche daten ankommen Line4 = "12345678;;;;4567;;4556";

die zwischenräume sollten beim splitten als leerfelder übernommen werden und nicht wie jetzt einfach übersprungen.


könnt ihr da weiterhelfen ??


danke !!!


----------



## madboy (20. Mrz 2009)

versuchs mit 
[HIGHLIGHT="Java"]line1.split(";", -1);[/HIGHLIGHT]
Das sollte leere Strings für direkt aufeinander folgende Semikolon liefern.


----------



## Ebenius (20. Mrz 2009)

Anmerkung 1: Dieser Weg über split ist vergleichsweise teuer; wenn die Eingabe also viele Zeilen beinhaltet, dann sollte man ein kompiliertes Pattern wiederverwenden: [HIGHLIGHT="Java"]final Pattern pattern = Pattern.compile(";");
final String[][] results = new String[input.length][];
for(int lineIndex = 0; lineIndex < results.length; lineIndex ++) {
  results[lineIndex] = pattern.split(input[lineIndex], -1);
}[/HIGHLIGHT]

Anmerkung 2: Wenn tatsächlich nur nach einem Zeichen gesplittet werden sollte und Geschwindigkeit ein Thema ist, dann sind würde ich auf reguläre Ausdrücke ganz verzichten und sowas machen: [Highlight=Java]final char delimn = ';';
final String[][] results = new String[input.length][];
final List<String> lineBuffer = new ArrayList<String>();
for (int lineIndex = 0; lineIndex < results.length; lineIndex++) {
  int cOffset = 0;
  final char[] cArray = input[lineIndex].toCharArray();
  for (int cIndex = 0; cIndex < cArray.length; cIndex++) {
    final char c = cArray[cIndex];
    if (delimn == c) {
      lineBuffer.add(new String(cArray, cOffset, cIndex - cOffset));
      cOffset = cIndex + 1;
    }
  }
  lineBuffer.add(new String(cArray, cOffset, cArray.length - cOffset));
  results[lineIndex] = lineBuffer.toArray(new String[lineBuffer.size()]);
  lineBuffer.clear();
}[/Highlight]
Ebenius


----------



## vodn7v (20. Mrz 2009)

perfekt. das läuft !!
vielen dank !!


----------

