2017-10-08 70 views
5

Moje pytanie brzmi, dlaczego następujący program:Jak działa metoda split() w java?

// Java program to demonstrate working of split(regex, 
// limit) with high limit. 
public class GFG 
{ 
    public static void main(String args[]) 
    { 
     String str = "[email protected]@geekss"; 
     String [] arrOfStr = str.split("s", 5); 
    } 
} 

dzieli ciąg "[email protected]@geekss" na 5 podciągi: {"geek", "", "@[email protected]", "", ""}. Według mnie powinny być 4 ciągi: {"geek", "","@[email protected]", ""}. Czy ktoś może wyjaśnić moje wątpliwości?

+3

Dlaczego nie wyjaśnisz, dlaczego oczekiwałeś innego wyniku? – shmosel

Odpowiedz

4

Jeśli uważnie przyjrzeć docs:

tablicy zwróconej przez tego sposobu zawiera każdy podciąg tego ciągu, który jest zakończony innego fragmentu, który pasuje do podanego wyrażenia lub jest zakończony koniec ciągu.

Więc wynikające tablica zawiera dwie rzeczy:

  • podłańcuchem Twojego ciąg którym następuje s (część kursywą)
  • co pozostało na końcu łańcucha (pogrubienie części)

Powód, dla którego otrzymałeś {"geek", "", "@[email protected]", ""} dla pierwszych czterech elementów, jest następująca po nich: s. Ostatni "", który masz, to to, co zostało po dopasowaniu co s.

Należy zauważyć, że podany argument limit z 5 jest również powiązany. Zgodnie z dokumentów:

Jeśli granica n jest większe od zera, a następnie układ ten będzie można zastosować w większości N - 1 razy, długość tablicowej będzie nie większa niż n i ostatnia pozycja tablicowej zawiera wszystkie dane wejściowe poza ostatnim dopasowanym separatorem.

Ostatnim dopasowanym ogranicznikiem jest s na samym końcu.Dalej jest jeszcze pusty ciąg, którego nie sprawdzono.

+0

Twoje ostatnie zdanie nie wyjaśnia dokładnie, co się dzieje. –

+0

@TimBiegeleisen Czy po edycji jest lepiej? Próbuję wyjaśnić to w inny sposób. – Sweeper

+0

Rozumiem ... dzięki –

1

Split("s", 5) znajdzie 4S znaków i zwraca 5 subtrings które są niezależnie istniejące pomiędzy dwoma kolejno 's' zatem puste podciągi lub od początku łańcucha aż do pierwszej „S”, i z ostatniego „s” do końca łańcucha znaków . Więc masz 5 podciągów.

Jeśli spojrzysz na bardzo użyteczny komentarz @ tobias_k, masz 4 znaki "chars", a nie 5, drugi parametr (numer 5) w metodzie dzielenia mówi ile podłoży, jeśli usuniemy s, przez 4 s tam to 5 podłańcuchów, jeśli spróbujesz z dowolną liczbą większą niż 5, otrzymasz te same wyniki, ponieważ nie ma żadnych innych podłańcuchów do podziału.

+3

Jest tylko 4 's', nie 5. –

+0

Po prostu sprawdzam, że liczba 5 jest kierowana do podłańcuchów, a nie do liter' s' tak, aby istniały 4 podciągi 5, jeśli umieścimy 4 zamiast 5, to nie zerwie ostatniego podłańcucha , Dzięki za komentarz!!! – coder

2

Oto obrazowym wyjaśnienie tego, co się dzieje:

^geek s s @[email protected] s s $ 
geek |""| @[email protected] |""|"" 

Stanowisko pomiędzy ogranicznikiem końcowym i $ liczony jest jako pusty ciąg meczu. Zauważ, że jeśli twój ciąg zaczynał się od s, wziąłbyś również pusty ciąg.

Najprostszym powodem, dla którego widzimy 5 dopasowań, jest to, że podzielony limit jest większy lub równy 5, ale to samo nie wyjaśnia wyniku.

+0

@Marvin Nie, myślę, że mój punkt widzenia jest jasny. Limit oznacza tylko zastosowanie wzoru 5 razy, nie wyjaśnia, dlaczego otrzymamy te mecze. –

+0

@Marvin OP wyraźnie zadał pytanie "Według mnie powinny istnieć 4 ciągi" i wyjaśnienie, dlaczego na końcu są dwa puste ciągi pasujące. Odpowiedziałem na to. –

+0

@Marvin Jeśli tak naprawdę jest to pytanie, wówczas OP powinien zostać wycofany, ponieważ na to pytanie można odpowiedzieć w 10 sekund, patrząc na Javadoc. –

0

Twój ciąg jest "geekss @ o @ geekss", więc jeśli wziąć pod uwagę 's' jako separatora, można uzyskać:

"maniakiem" + [ 's'] + "" + [ 's' ] + "@ o @ maniakiem" + [ 's'] "" + [ 's'] + ""

Więc trzeba ["geek", "", "@[email protected]", "", ""]

Może ta część, która jest niejasna cię to ostatni ciąg pusty. Należy pamiętać, że separator jest zawsze "zawarty" w ciągu znaków. Tak więc, jeśli występuje na końcu, jest to faktycznie uważane za "your_string" + your_delimiter + "".

To samo by się stało, jeśli twój ciąg zaczyna się od "s": w takim przypadku pierwszym elementem twojej podzielonej tablicy będzie "".