2013-07-26 7 views
9

Ich habe eine Zeichenfolge, die wie folgt aussieht:Split ein String an jedem 3. Komma in Java

0,0,1,2,4,5,3,4,6 

Was ich will wieder ein String[] ist, die nach jeder 3. Komma aufgeteilt wurde, so dass das Ergebnis wie folgt aussehen würde :

[ "0,0,1", "2,4,5", "3,4,6" ] 

Ich habe ähnliche Funktionen gefunden, aber sie teilen nicht bei der n-ten Menge von Kommas.

+4

Haben Sie eine Funktion versucht, das Schreiben selbst, es zu analysieren/aufspalten? – Jashaszun

+0

Ein Ansatz, der nützlich sein könnte, besteht darin, zuerst "0,0,1,2,4,5,3,4,6" in "0,0,1 | 2,4,5 | 3,4,6" zu ändern was ist ein ziemlich einfacher regulärer Ausdruck ersetzen Übersetzung. Oder verwenden Sie einfach einen Matcher direkt und gehen Sie ihn inkrementell [wie hier gezeigt] (http://stackoverflow.com/a/1277171/2246674). – user2246674

+0

Zwei Möglichkeiten, die ich mir vorstellen kann: benutze 'indexOf' in einer while-Schleife oder spalte auf', 'und klebe die Ergebnisse dann wieder in Dreiergruppen zusammen. – flup

Antwort

22

können Sie versuchen, split Methode mit (?<=\\G\\d+,\\d+,\\d+), regex verwenden

Demo

String data = "0,0,1,2,4,5,3,4,6"; 
String[] array = data.split("(?<=\\G\\d+,\\d+,\\d+),"); //Magic :) 
// to reveal magic see explanation below answer 
for(String s : array){ 
    System.out.println(s); 
} 

Ausgang:

0,0,1 
2,4,5 
3,4,6 

Erklärung

  • \\d bedeutet auf e Ziffer, gleich wie [0-9], wie 0 oder 3
  • \\d+ bedeutet eine oder mehr Ziffern wie 1 oder 23
  • \\d+, bedeutet eine oder mehr Stellen mit Komma, nachdem es, wie 1, oder 234,
  • \\d+,\\d+,\\d+ drei Zahlen mit Komma zwischen ihnen wie 12,3,456
  • \\G bedeutet letztes Spiel akzeptieren, oder wenn es keine (bei dem ersten Verwendung) Anfang des Strings
  • (?<=...), ist positive look-behind die Übereinstimmen Komma ,, die vor ihm in (?<=...) auch eine Schnur beschrieben hat
  • (?<=\\G\\d+,\\d+,\\d+), so wird versucht Komma zu finden, die drei Zahlen, bevor sie hat, und diese Zahlen haben Äther Anfang der Zeichenfolge, bevor es (wie ^0,0,1 in Ihr Beispiel) oder zuvor übereinstimmendes Komma, wie 2,4,5 und 3,4,6.

Auch im Fall, dass Sie dann andere Zeichen verwenden Ziffern, die Sie auch anderen Satz von Zeichen wie

  • \\w die alphabetischen Zeichen werden übereinstimmen können, Ziffern und _
  • \\S alles das ist nicht Leerraum
  • [^,] alles, was nicht Komma ist
  • ... und so weiter. Mehr Informationen in Pattern documentation

By the way, wird diese Form bei jeder 3. mit Split arbeiten, 5., 7., (und andere ungerade Zahlen) Komma, wie split("(?<=\\G\\w+,\\w+,\\w+,\\w+,\\w+),") auf jedem 5. Komma aufgeteilt wird.

an jedem 2., 4., 6. So teilen, 8. (und der Rest der geraden Zahlen) Komma Sie + mit {1,maxLengthOfNumber} wie split("(?<=\\G\\w{1,3},\\w{1,3},\\w{1,3},\\w{1,3}),") ersetzen müssen bei jeder 4. Komma zu trennen, wenn Zahlen maximal 3 Ziffern haben (0, 00 , 12, 000, 123, 412, 999).

an jedem 2. Komma So teilen Sie auch diese regex split("(?<!\\G\\d+),") auf meinem previous answer so etwas wie die unten Versuchen

+0

Schöne Antwort können Sie den Regex erklären? –

+2

Netter Ansatz. Ich habe '\ G' vergessen. – user2246674

+0

@KevinBowersox ist diese Erklärung genug? – Pshemo

6

Basis verwenden können:

public String[] mySplitIntoThree(String str) 
{ 
    String[] parts = str.split(","); 

    List<String> strList = new ArrayList<String>(); 

    for(int x = 0; x < parts.length - 2; x = x+3) 
    { 
     String tmpStr = parts[x] + "," + parts[x+1] + "," + parts[x+2]; 

     strList.add(tmpStr); 
    } 

    return strList.toArray(new String[strList.size()]); 
} 

(Sie müssen möglicherweise java.util.ArrayList importieren und java.util.List)

+1

+1 für die beste lesbare Antwort des Loses – flup

+1

Fast perfekt, aber leider Code wird nicht kompilieren. Auch dieser Ansatz wird die letzte Zeile überspringen. Vielleicht ist 'x Pshemo

+0

Ganz recht Pshemo, ich habe das falsche ToArray() anstatt ToArray (T []) verwendet, habe meine Antwort so angepasst, dass sie nun kompiliert wird – Knightsy

2

Schön für das Coding Dojo! Hier ist meine gute altmodische C-Stil Antwort:

Wenn wir die Bits zwischen Kommas ‚Teile‘ nennen, und die Ergebnisse, die abspalten get ‚Substrings‘ dann:

n ist die Menge der Teile gefunden, so bis jetzt ist i der Start des nächsten Teils, startIndex der Anfang der aktuellen Teilzeichenfolge

Iterate über die Teile, jeden dritten Teil: einen teil~~POS=TRUNC abhacken.

Fügen Sie den übrig gebliebenen Teil am Ende zu dem Ergebnis hinzu, wenn Sie kein Komma mehr haben.

List<String> result = new ArrayList<String>(); 
int startIndex = 0; 
int n = 0; 
for (int i = x.indexOf(',') + 1; i > 0; i = x.indexOf(',', i) + 1, n++) { 
    if (n % 3 == 2) { 
     result.add(x.substring(startIndex, i - 1)); 
     startIndex = i; 
    } 
} 
result.add(x.substring(startIndex)); 
7

Obligatorische Guava Antwort:

String input = "0,0,1,2,4,5,3,4,6"; 
String delimiter = ","; 
int partitionSize = 3; 

for (Iterable<String> iterable : Iterables.partition(Splitter.on(delimiter).split(s), partitionSize)) { 
    System.out.println(Joiner.on(delimiter).join(iterable)); 
} 

Ausgänge:

0,0,1 
2,4,5 
3,4,6