Odpowiednik w Java funkcji explode() z języka PHP

W języku PHP istnieje niezwykle przydatna funkcja explode(), która zamienia string na tablicę string’ów dzieląc go w miejscu wystąpienia określonego znaku. Zilustruje to poniższy przykład.

<?php 
    $sString = ":aaa:111::bbb:";
    print_r( explode(":", $sString) );
?>

Powyższy kod zwraca:

Array
(
    [0] => 
    [1] => aaa
    [2] => 111
    [3] => 
    [4] => bbb
    [5] => 
)

Ważne, aby zauważyć, iż gdy występują obok siebie dwa delimitery (tutaj to znak :) to zwracany jest w tym miejscu pusty string. Podobnie ma się sytuacja, gdy delimiter jest na końcu lub początku.

W język Java nie jest to już tak wygodnie zrealizowane. Przeanalizujmy pierwszy przykład.

import java.util.StringTokenizer;
 
StringTokenizer st1 = new StringTokenizer( ",aaa,bbb,,ccc,", "," );
while( st1.hasMoreTokens() ) {
    System.out.println( st1.nextToken() );
}

Powyższy kod wpisze na konsoli, co następuje.

aaa
bbb
ccc

Różnicami w stosunku do tego, co mieliśmy w przypadku explode() jest to, że stojące obok siebie delimitery nie zwracają pustego stringa. Delimitery na końcach stringa są również pomijane. Teraz kolejny przykład.

import java.util.StringTokenizer;
 
StringTokenizer st2 = new StringTokenizer( ",aaa,bbb,,ccc,", ",", true );
while( st2.hasMoreElements() ) {
    System.out.println( st2.nextElement() );
}

Powyższy kod wpisze na konsoli, co następuje.

,
aaa
,
bbb
,
,
ccc
,

Dodanie argumentu true spowodowało, że delimitery są zwracane tak jak substringi. Nie jest to dalej to samo co explode(). Teraz przeanalizujmy przykład, który zadziała dokładnie tak samo, jak explode().

import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
 
String sStr = ",aaa,bbb,,ccc,,,ddd";
String sDelim = ",";
ArrayList<String> alTokens = new ArrayList<String>();
 
if( sStr.substring(0, 1).equals(sDelim) )
    alTokens.add( "" );
 
StringTokenizer st3 = new StringTokenizer( sStr, sDelim,  true);
int i = 0;
while( st3.hasMoreTokens() ) {
    String sToken = st3.nextToken();
    if( sToken.equals(sDelim) ) {
        i++;
        if( i==1 ) continue;
        else alTokens.add( "" );
    }
    else {
        alTokens.add( sToken );
        i = 0;
    }
}
 
if( sStr.substring(sStr.length()-1, sStr.length()).equals(sDelim) )
    alTokens.add( "" );
 
for( String sToken: alTokens ) {
    System.out.println( sToken );
}

Powyższy kod wpisze na konsoli, co następuje.

 
aaa
bbb
 
ccc
 
 
ddd

Czyli teraz mamy dokładnie to, o co nam chodziło. Było z tym znacznie więcej roboty niż w przypadku PHP, no ale niestety.