10 octubre 2012

Ejemplos de split de Strings

Siempre me pasa lo mismo, voy a utilizar el método split de la clase String, y no estoy seguro del todo cómo se va a comportar, así que dejo por aquí una clase que ilustra bastante bien el comportamiento de este método tan útil y de paso, una versión "mejorada" de split el cual no te incluye espacios en blanco.


package es.snippetea;

import java.util.ArrayList;

/**

* Ejemplos de funcionamiento del split de Strings y adición de
* un par de metodos de utilidad.
* @author icendrero
*/
public class EjemploSplits {
  public static void main(String[] args) {
        System.out.println("-------------------------------");
        String textoParaSplit = "";
        String delimitador = "";
        /*
        * Separador '.', el cual no separa nada porque en expresiones
        * regulares, significa cualquier caracter.
        */
        textoParaSplit = "a.b.c.d.e";
        delimitador = ".";
        delimitame(textoParaSplit,delimitador);
       
        /*
        * Si se quiere separar por ., hay que fugarlo con '\.'
        */
        textoParaSplit = "a.b.c.d.e";
        delimitador = "\\.";
        delimitame(textoParaSplit,delimitador);
       
        //El delimitador ahora será cualquier letra de la 'a' a la 'z'
        textoParaSplit = "a.b.c.d.e";
        delimitador = "[a-z]";
        delimitame(textoParaSplit,delimitador);
       
        //El delimitador ahora será cualquier letra de la 'A' a la 'z'
        textoParaSplit = "a.b.c.d.e";
        delimitador = "[A-z]";
        delimitame(textoParaSplit,delimitador);
       
        /*
        * El delimitador ahora será cualquier letra de la 'A'
        * a la 'Z' -> No lo encuentra porque no hay.
        */
        textoParaSplit = "a.b.c.d.e";
        delimitador = "[A-Z]";
        delimitame(textoParaSplit,delimitador);
       
        /*
        * El delimitador ahora será cualquier letra de la 'b'
        * a la 'c' -> Separa por b o por c
        */
        textoParaSplit = "a.b.c.d.e";
        delimitador = "[b-c]";
        delimitame(textoParaSplit,delimitador);
       
        /*
        * El delimitador ahora será cualquier letra de la 'b'
        * a la 'c' -> Separa por b o por c
        */
        textoParaSplit = "a\\b\\c\\d\\e";
        delimitador = "\\\\";
        delimitame(textoParaSplit,delimitador);
       
        /*
        * El delimitador ahora será cualquier letra de la 'b'
        * a la 'c' -> Separa por b o por c
        */
        textoParaSplit = "Primero una pAlabra, luego oTr-a";
        delimitador = "[a-z]";
        delimitame(textoParaSplit,delimitador);
       
        /*
        * El delimitador ahora será cualquier letra de la 'a'
        * a la 'z' sin tener en cuenta los espacios en blanco ni
        * los nulos.
        */
        textoParaSplit = "Primero una pAlabra{ luego oTr-a";
        delimitador = "[a-z]";
        delimitameLimpio(textoParaSplit,delimitador);
       
  }
 
  /**
  * Metodo para mostrar el delimitador de la clase String
  * @param texto texto a delimitar
  * @param delimitador caracter por el cual delimitar
  */
  public static void delimitame(String texto, String delimitador){
        String[] textoSeparado;
        System.out.println("Texto a separar: "+texto);
        System.out.println("Separar por: "+delimitador);
        System.out.println("Texto separado:");
        textoSeparado = texto.split(delimitador);
        System.out.println("\t"+printArray(textoSeparado));
        System.out.println("-------------------------------");
  }
 
  /**
  * Metodo para mostrar el delimitador limpio el cual
  * te devuelve un array de String[] sin espacios en blanco
  * @param texto texto a delimitar
  * @param delimitador caracter por el cual delimitar
  */
  public static void delimitameLimpio(String texto, String delimitador){
        String[] textoSeparado;
        System.out.println("Texto a separar: "+texto);
        System.out.println("Separar por: "+delimitador);
        System.out.println("Texto separado en limpio(sin espacios en blanco):");
        textoSeparado = splitterNoEmptySpaces(texto,delimitador);
        System.out.println("\t"+printArray(textoSeparado));
        System.out.println("-------------------------------");
  }
 
  /**
  * Devuelve un String formateado para imprimir arrays
  *
  * @param array Array a imprimir
  * @return String formateado
  */
  public static String printArray(String[] array){
        StringBuffer append = new StringBuffer("[");
        if(array.length!=0){
              for (int i = 0; i < array.length; i++) {
                    if (i != array.length - 1) {
                         append.append(array[i] + ", ");
                    } else {
                         append.append(array[i] + "]");
                    }
              }
        }else{
              append.append("]");
        }
        return append.toString();
  }
 
  /**
  *
  * Realiza la misma función que el Split de la clase String
  * pero no devuelve espacios en blanco ni caracteres nulos.
  *
  * @param text texto a separar
  * @param delimiter caracter de separacion
  * @return Array de Strings con la separación
  */
  public static String[] splitterNoEmptySpaces(String text,String delimiter){
        //Variables
        ArrayList result = new ArrayList();
        String[] temp = text.split(delimiter);
        //Rellenamos el arraylist
        for (int i = 0; i < temp.length; i++)
if(!isNullOrWhitespace(temp[i]))
result.add(temp[i]);
        //Lo pasamos a String[] para que sea similar al split original.
        temp = new String[result.size()];
        for (int i = 0; i < temp.length; i++)temp[i] = result.get(i);
       
        return temp;
  }
 
  /**
  * Metodo que nos ahorra escribir "".equals(text)||null==text en cada if
  * @param text texto a comprobar
  * @return true si es nulo o un espacio en blanco o vacío
  */
  public static boolean isNullOrWhitespace(String text){
        if("".equals(text.trim())||null==text)return true;
        return false;
  }
}


El resultado que se obtiene tras la ejecución de EjemploSplits es:
------------------------------
Texto a separar: a.b.c.d.e
Separar por: .
Texto separado:
[]
-------------------------------
Texto a separar: a.b.c.d.e
Separar por: \.
Texto separado:
[a, b, c, d, e]
-------------------------------
Texto a separar: a.b.c.d.e
Separar por: [a-z]
Texto separado:
[, ., ., ., .]
-------------------------------
Texto a separar: a.b.c.d.e
Separar por: [A-z]
Texto separado:
[, ., ., ., .]
-------------------------------
Texto a separar: a.b.c.d.e
Separar por: [A-Z]
Texto separado:
[a.b.c.d.e]
-------------------------------
Texto a separar: a.b.c.d.e
Separar por: [b-c]
Texto separado:
[a., ., .d.e]
-------------------------------
Texto a separar: a\b\c\d\e
Separar por: \\
Texto separado:
[a, b, c, d, e]
-------------------------------
Texto a separar: Primero una pAlabra, luego oTr-a
Separar por: [a-z]
Texto separado:
[P, , , , , ,  , , ,  , A, , , , , , , , , , ,  , T, -]
-------------------------------
Texto a separar: Primero una pAlabra{ luego oTr-a
Separar por: [a-z]
Texto separado en limpio(sin espacios en blanco):
[P, A, { , T, -]
-------------------------------

No hay comentarios:

Publicar un comentario