Split , problemas con pipes "|" y StringTokenizer
Bueno, pues no se si seran chanchullos, pero el caso es que el otro dia haciendo unas movidas para separar cadenas con pipes "|" y demas y vi algunas cosas curiosas.....
SPLIT Y LOS PIPES "|"
Por lo visto, el caracter "|" es un caracter especial que no funciona bien con el metodo split. Este metodo lo identifica como separador de letras, asi que lo encuentra despues de cada caracter en un string.
Asi por ejemplo si ejecutamos esto:
El resultado es este:
Tokens encontrados :11
tokenes 0 ->
tokenes 1 -> h
tokenes 2 -> o
tokenes 3 -> l
tokenes 4 -> a
tokenes 5 -> |
tokenes 6 -> a
tokenes 7 -> m
tokenes 8 -> i
tokenes 9 -> g
tokenes 10 -> o
Vemos que cada vez que hay cambio de caracter, lo identifica como pipe.
La forma de resolver este asunto es escapar el caracter pipe cuando se especifica en el split. De esta manera: "\\|"
Ahora si ejecutas el anterior codigo especificando el nuevo split escapado el resultado es este:
OTRAS CURIOSIDADDES DE SPLIT
Tambien me he encontrado otras "curiosidades", por ejemplo si intentamos leer "partes" vacias de un String mediante split.
Por ejemplo , esta cadena ";hola;amigos" . Si hacemos split con ";" vemos que tiene 3 partes, la primera vacia, luego "hola" y "amigos". Lo hace bien, o es el resultado que yo esperaba.
El resultado , esta bien y es este:
Pero , ¿y si lo hacemos al contrario?, es decir que si acaba con parte vacia "hola;amigos;" yo tambien espero 3 partes : "hola", "amigos" y una ultima vacia..... Pues no hace el resultado esperado!!
Y el resultado es este. (Que no digo que este mal, pero esto no es muy coherente con el comportamiento anterior)
Asi que ten cuidao con el split que lo carga el diablo!!!
Asi que me dije a mi mismo , "no seas pringao y usa el StringTokenizer" y cual fue mi sorpresa cuando me encuentro mas de lo mismo...
STRINGTOKENIZER
El String Tokenizer ignora los posibles cachos vacios, al principio, entre medias y al final de la cadena.
Aqui van algunos ejemplos:
Resultado
tokenes ->hola
tokenes ->amigo
Estas siguiente conbinaciones de String dan el mismo resultado, (solo genera 2 partes ):
";hola;amigo"
";hola;amigo;"
";hola;;;;;amigo"
etc...
Asi que ten cuidado al usar Stringtokenizer, porque quizas no obtengas el resultado esperado!!
(eso me paso por gañan y no mirar bien el API, asi que echale un ojo de vez en cuando no te creas todo lo que lees por internet!!)
Espero que te haya ayudado!!
SPLIT Y LOS PIPES "|"
Por lo visto, el caracter "|" es un caracter especial que no funciona bien con el metodo split. Este metodo lo identifica como separador de letras, asi que lo encuentra despues de cada caracter en un string.
Asi por ejemplo si ejecutamos esto:
String cadena = "hola|amigo";
//Probamos con split (no lo hara bien
String []tokenes = cadena.split("|");
System.out.println("Tokens encontrados :"+tokenes.length);
for(int i =0; i<tokenes.length;i++){
System.out.println("tokenes "+i+" -> "+tokenes[i]);
}
//Probamos con split (no lo hara bien
String []tokenes = cadena.split("|");
System.out.println("Tokens encontrados :"+tokenes.length);
for(int i =0; i<tokenes.length;i++){
System.out.println("tokenes "+i+" -> "+tokenes[i]);
}
Tokens encontrados :11
tokenes 0 ->
tokenes 1 -> h
tokenes 2 -> o
tokenes 3 -> l
tokenes 4 -> a
tokenes 5 -> |
tokenes 6 -> a
tokenes 7 -> m
tokenes 8 -> i
tokenes 9 -> g
tokenes 10 -> o
Vemos que cada vez que hay cambio de caracter, lo identifica como pipe.
La forma de resolver este asunto es escapar el caracter pipe cuando se especifica en el split. De esta manera: "\\|"
String []tokenes = cadena.split("\\|");
Ahora si ejecutas el anterior codigo especificando el nuevo split escapado el resultado es este:
Tokens encontrados :2
tokenes 0 -> hola
tokenes 1 -> amigo
tokenes 0 -> hola
tokenes 1 -> amigo
OTRAS CURIOSIDADDES DE SPLIT
Tambien me he encontrado otras "curiosidades", por ejemplo si intentamos leer "partes" vacias de un String mediante split.
Por ejemplo , esta cadena ";hola;amigos" . Si hacemos split con ";" vemos que tiene 3 partes, la primera vacia, luego "hola" y "amigos". Lo hace bien, o es el resultado que yo esperaba.
String cadena = ";hola;amigo";
//Probamos con split (no lo hara bien
String []tokenes = cadena.split(";");
System.out.println("Tokens encontrados :"+tokenes.length);
for(int i =0; i<tokenes.length;i++){
System.out.println("tokenes "+i+" -> "+tokenes[i]);
}
//Probamos con split (no lo hara bien
String []tokenes = cadena.split(";");
System.out.println("Tokens encontrados :"+tokenes.length);
for(int i =0; i<tokenes.length;i++){
System.out.println("tokenes "+i+" -> "+tokenes[i]);
}
El resultado , esta bien y es este:
Tokens encontrados :3
tokenes 0 ->
tokenes 1 -> hola
tokenes 2 -> amigo
tokenes 0 ->
tokenes 1 -> hola
tokenes 2 -> amigo
Pero , ¿y si lo hacemos al contrario?, es decir que si acaba con parte vacia "hola;amigos;" yo tambien espero 3 partes : "hola", "amigos" y una ultima vacia..... Pues no hace el resultado esperado!!
String cadena = "hola;amigo;";
//Probamos con split (no lo hara bien
String []tokenes = cadena.split(";");
System.out.println("Tokens encontrados :"+tokenes.length);
for(int i =0; i<tokenes.length;i++){
System.out.println("tokenes "+i+" -> "+tokenes[i]);
}
//Probamos con split (no lo hara bien
String []tokenes = cadena.split(";");
System.out.println("Tokens encontrados :"+tokenes.length);
for(int i =0; i<tokenes.length;i++){
System.out.println("tokenes "+i+" -> "+tokenes[i]);
}
Y el resultado es este. (Que no digo que este mal, pero esto no es muy coherente con el comportamiento anterior)
Tokens encontrados :2
tokenes 0 -> hola
tokenes 1 -> amigo
tokenes 0 -> hola
tokenes 1 -> amigo
Asi que ten cuidao con el split que lo carga el diablo!!!
Asi que me dije a mi mismo , "no seas pringao y usa el StringTokenizer" y cual fue mi sorpresa cuando me encuentro mas de lo mismo...
STRINGTOKENIZER
El String Tokenizer ignora los posibles cachos vacios, al principio, entre medias y al final de la cadena.
Aqui van algunos ejemplos:
String cadena = ";hola;amigo";
StringTokenizer st= new StringTokenizer (cadena, ";");
while (st.hasMoreTokens()){
System.out.println("tokenes ->"+ st.nextToken());
}
StringTokenizer st= new StringTokenizer (cadena, ";");
while (st.hasMoreTokens()){
System.out.println("tokenes ->"+ st.nextToken());
}
Resultado
tokenes ->hola
tokenes ->amigo
Estas siguiente conbinaciones de String dan el mismo resultado, (solo genera 2 partes ):
";hola;amigo"
";hola;amigo;"
";hola;;;;;amigo"
etc...
Asi que ten cuidado al usar Stringtokenizer, porque quizas no obtengas el resultado esperado!!
(eso me paso por gañan y no mirar bien el API, asi que echale un ojo de vez en cuando no te creas todo lo que lees por internet!!)
Espero que te haya ayudado!!
Comentarios
Publicar un comentario