2013-02-27 12 views
19

Mam następujący przykład, aby lepiej co próbuję zrobić wyjaśnić:Java podzielonego przez kolejne charakteru

String text = "a,b,,,,c,,"; 
String[] split = text.split(","); 
for(int i=0;i<split.length;i++){ 
    System.out.println("I = "+i+" "+split[i]); 
} 

Wyjście jest:

I = 0 a 

I = 1 b 

I = 2 

I = 3 

I = 4 

I = 5 c 

Ale co chcę jest aby uzyskać tablicę o rozmiarze 8, zawierający także:

I = 6 

I = 7 

oczywiście, ostatnie 2 elementy będą puste struny, ale jest niezbędna dla m e je zdobyć. Sądzę, że logiczne jest ich posiadanie. To znaczy, jeśli miałem:

String text = "a,b,,,,c,,d"; 

Wynik byłby tablicę wielkości 8 i nie sądzę, istnieje duża różnica pomiędzy przykładów 2.

Odpowiedz

26
String[] split = text.split(",", -1); 

Zachowanie to rzeczywiście wygląda na trudne, ale w rzeczywistości jest wyjaśnione (IMHO nie bardzo dobrze, że powiedziane) w official documentation.

jeśli n jest siłowo wówczas wzór będzie stosowana tak często, jak to możliwe i tablica może mieć dowolną długość

text.split(",") Problemem jest to, że jest to równoważne z text.split(",", 0). Stosując 0 ograniczenie, jak to opisano w dokumentacji:

Jeżeli n oznacza zero, wówczas wzór będzie stosowana tak często, jak możliwe, tablica może mieć dowolną długość i końcowe puste ciągi zostaną usunięte.

Zdecydowanie nie chcesz, aby puste struny zostały odrzucone.

+6

Wow. Nie sądziłem, że mógłbym nauczyć się czegoś nowego o tak podstawowej rzeczy jak "String # split". Myliłem się. Zarówno pytanie, jak i odpowiedź były niezwykle edukacyjne. To powiedziawszy, oferowanie użytkownikowi * objaśnienia * wymagałoby dobrej odpowiedzi i uczynienia go doskonałym. –

+0

Dziękuję, działa świetnie! Zaprogramowałem aplikacje w Javie na około 3 lata, ale wydaje się, że zawsze są nowe rzeczy do nauki, nawet jeśli wydają się proste od pierwszego wejrzenia. – Anakin001

+0

@ T.J.Crowder Właśnie miałem ten problem w zeszłym tygodniu i działało. Właściwie nie bardzo rozumiem, dlaczego/jak to działa, a dokumentacja nie jest do końca jasna – m0skit0

0

Wolę (jeśli można użyć zewnętrznych bibliotek):

String[] split = StringUtils.splitPreserveAllTokens(text, ',');

W przeważającej części biblioteki StringUtils wydaje się być tylko trochę bardziej efektywne niż realizacja domyślne java, bo ... dobrze , hej, dlatego Apache nie przejmował się pisaniem tego. Dodatkowo, na pierwszy rzut oka jasne jest, co robi ten podział od nazwy metody, podczas gdy na pierwszy rzut oka regularne rozszczepienie łańcucha z limitem -1 może nie być.