jump to navigation

StringTokenizer modificado para usar multiples caracteres febrero 28, 2007

Posted by superpiwi in Java.
trackback

He tenido que hacer una clase muy rapida para tokenizar cadenas cuando el delimitador no es de un solo caracter sino que esta compuesto por multiples caracteres. El tema es que tenia que pasar una serie de parametros compuestos y una de dos, o modificaba el Stringtokenizer para poder parsearlos correctamente o cambiaba la forma de enviar los parametros (por ejemplo usando JSon).

Imaginate que tienes una cadena con estos valores:

valor1=1|2|3 ||| valor2=3|4|5 ||| valor3=0

Si utilizas el StringTokenizer normal :

StringTokenizer st=new StringTokenizer(cadena,"|||");

Realmente no es correcto, porque no le estas indicando que tokenize por la cadena “|||” sino que use 3 tokenizadores de 1 caracter que son el mismo “|”. Asi que al recuperar los tokens obtienes;


valor1=1
2
3
valor2=3
4
5
valor3=0

Con esta clase que he implementado y usando el delimitador “|||” ya se tokeniza de manera correcta.


valor1=1|2|3
valor2=3|4|5
valor3=0

Aqui el código (no esta optimizado porque he tenido poco tiempo era más una solución para salir del paso).


/**
* MiStringTokenizer
*
* Sencilla clase para poder tokenizar por mas de un caracter.
* Ejemplo:
*
* 1 | 2 ||| 3 ||| 4 | 5 | 6 con StringTokenizer normal devuelve 1,2,3,4,5,6
* con MiStringTokenizer devuelve 1|2|,3,4|5|6
*
* @author jdelgado
* @version 0.0.0.1 - Version inicial puede tener errores
* @since 27 Feb 2007 - Eclipse 3.2
*/
package comun.util;
import java.util.StringTokenizer;
public class MiStringTokenizer
{
private String cadena;
private String delimitador;
private String _procesa;
/**
* Constructor
* @param cadena cadena a procesar
* @param multipledelimitador tokenizador
*/
public MiStringTokenizer(String cadena,String multipledelimitador)
{
this.cadena = cadena;
this.delimitador=multipledelimitador;
this._procesa = cadena;
}
//----
/**
* Cuenta el numero de tokens
* @return el numero de tokens
*/
public int countTokens()
{
try
{
int len = cadena.length();
if (this.cadena==null) return 0;
if (len==0) return 0;
if (this.delimitador==null) return 0;
int del_len = this.delimitador.length();
if (del_len==0) return 0;
String trata=cadena;
int count=1;
int posic = trata.indexOf(this.delimitador);
while (posic!=-1)
{
trata = trata.substring(posic+del_len);
count++;
posic = trata.indexOf(this.delimitador);
}
return count;
}
catch(Exception e)
{
return 0;
}
}
//-----
/**
* Indica si quedan tokens por procesar
* @return variable booleanda indicando si quedan tokens para procesar
*/
public boolean hasMoreTokens()
{
if (this._procesa==null) return false;
if (this._procesa.length()==0) return false;
int posi = _procesa.indexOf(this.delimitador);
return (posi!=-1||_procesa.length()>0);
}
//----
/**
* Devuelve el proximo token
* @return un String con el proximo token
* @throws Exception Excepcion levantada en caso de error
*/
public String nextToken() throws Exception
{
if (_procesa==null) throw new Exception("no quedan tokens");
String token="";
int posi = _procesa.indexOf(this.delimitador);
if (posi!=-1)
{
int len = this.delimitador.length();
token = _procesa.substring(0,posi);
_procesa = _procesa.substring(posi+len);
}
else
{
token = _procesa;
_procesa = null;
}
return token;
}
//----
/**
* Para probar el correcto funcionamiento de la clase de ejemplo
*/
public static void main(String[] args)
{
try
{
String cadena="valores=1|2|3|||valores=4|5|6|||valores=7|8|9";
String delimitador="|||";
MiStringTokenizer st = new MiStringTokenizer(cadena,delimitador);
int numeroTokens = st.countTokens();
System.out.println("cadena:"+cadena);
System.out.println("numero de tokens:"+numeroTokens);
while (st.hasMoreTokens())
{
String token = st.nextToken();
System.out.println("token:"+token);
}
/*
StringTokenizer st2 = new StringTokenizer(cadena,delimitador);
numeroTokens = st2.countTokens();
System.out.println("cadena:"+cadena);
System.out.println("numero de tokens:"+numeroTokens);
while (st2.hasMoreTokens())
{
String token = st2.nextToken();
System.out.println("token:"+token);
}
*/
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
//end of clas MiStringTokenizer

** Actualizacion ** En http://snippets.dzone.com encuentro un metodo que es mas eficiente que el que he implementado:


private String[] splitString(String str, String delims)
{
if(str == null)
return null;
else if(str.equals("") || delims == null || delims.length() == 0)
return new String[]{ str };
String[] s;
Vector v = new Vector();
int pos = 0;
int newpos = str.indexOf(delims, pos);;
while(newpos != -1)
{
v.addElement(str.substring(pos, newpos));
pos = newpos + delims.length();
newpos = str.indexOf(delims, pos);
}
v.addElement(str.substring(pos));
s = new String[v.size()];
for(int i=0, cnt=s.length; i<cnt; i++)
s[i] = (String) v.elementAt(i);
return s;
}

Cuando disponga de tiempo, seguramente modificare la clase para usarlo.

Comentarios»

1. Jhoher & Madoka - octubre 28, 2007

Gracias por el metodo!

2. chai - diciembre 7, 2007

gracias por el metodo,me ha sido de gran utilidad

3. chai - diciembre 12, 2007

por fis pueden hablar tambien de los applets


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: