La clase StringTokenizer

prev.gif (997 bytes)chapter.gif (1105 bytes)home.gif (1054 bytes)next.gif (998 bytes)

Las clases Vector y StringTokenizer

Los constructores

Obtención de tokens


La clase StringTokenizer nos ayuda a dividir un string en substrings o tokens, en base a otro string (normalmente un carácter) separador entre ellos denominado delimitador.

Supongamos un string consistente en el nombre, y los dos apellidos de una persona separados por espacios en blanco. La clase StringTokenizer nos ayuda a romper dicho string en tres substrings basado en que el carácter delimitador es un espacio en blanco.

disco.gif (1035 bytes)tokens: TokenApp.java

Un control área de texto, permite varias líneas de texto, cada línea está separada de la siguiente mediante un carácter nueva línea '\n' que se obtiene pulsando la tecla Enter o Retorno. Mediante una función denominada getText obtenemos todo el texto que contiene dicho control. La clase StringTokenizer nos permite dividir el string obtenido en un número de substrings o tokens igual al número de líneas de texto, basado en que el carácter delimitador es '\n'.

Para usar la clase StringTokenizer tenemos que poner al principio del archivo del código fuente la siguiente sentencia import.

	import java.util.*;

o bien

	import java.util.StringTokenizer;

 

Los constructores

Creamos un objeto de la clase StringTokenizer llamando a uno de los tres constructores que tiene la clase. Al primer constructor, se le pasa el string nombre que va a ser dividido teniendo en cuenta que el espacio en blanco es el delimitador por defecto.

	String nombre="Angel Franco García";
	StringTokenizer tokens=new StringTokenizer(nombre);

Supongamos ahora que en un control área de texto introducimos los siguientes datos, resultado de ciertas medidas, tal como se ve a la izquierda en la figura.

error.gif (3348 bytes)

Obtenemos el texto del control área de texto. Creamos un objeto tokens de la clase StringTokenizer, pasándole el string strDatos y el delimitador "\n"

	String strDatos="6.3\n6.2\n6.4\n6.2";
	StringTokenizer tokens=new StringTokenizer(strDatos, "\n");

 

Obtención de los tokens

La clase StringTokenizer implementa el interface Enumeration, por tanto define las funciones nextElement y hasMoreElements.

public class StringTokenizer implements Enumeration {
	//...
    public boolean hasMoreElements() {
	//...
    }
    public Object nextElement() {
	//...
    }
}

Para el programador es más cómodo usar las funciones miembro equivalentes nextToken y hasMoreTokens. Para extraer el nombre, el primer apellido y el segundo apellido en el primer ejemplo, escribiremos

      	String nombre="Angel Franco García";
	StringTokenizer tokens=new StringTokenizer(nombre);
	while(tokens.hasMoreTokens()){
            System.out.println(tokens.nextToken());
        }

El segundo ejemplo, requiere un poco más de trabajo, ya que  además de extraer los tokens del string strDatos, hemos de convertir cada uno de los substrings en un valor numérico de tipo double y guardarlos en el array datos del mismo tipo. Véase la sección convertir un string en un valor numérico.

            String str=tokens.nextToken();
            datos[i]=Double.valueOf(str).doubleValue();

El número de tokens o de datos nDatos que hay en un string strDatos, se obtiene mediante la función miembro countTokens. Con este dato establecemos la dimensión del array datos.

        int nDatos=tokens.countTokens();
        double[] datos=new double[nDatos];

Una vez guardados los datos introducidos en el control área de texto en el array datos, podemos operar con ellos, obteniendo su valor medio, y el error cometido en las medidas efectuadas.

El código completo para extraer los tokens del string strDatos y guardarlos en un array datos, es el siguiente.

	String strDatos="6.3\n6.2\n6.4\n6.2";
	StringTokenizer tokens=new StringTokenizer(strDatos, "\n");
        int nDatos=tokens.countTokens();
        double[] datos=new double[nDatos];
        int i=0;
        while(tokens.hasMoreTokens()){
            String str=tokens.nextToken();
            datos[i]=Double.valueOf(str).doubleValue();
            System.out.println(datos[i]);
            i++;
        }