viernes, 5 de agosto de 2011

Eliminación de espacios de sobra en cadenas de texto

Este tema es algo simple, pero dado que existen algunas alternativas, y es algo interesante a la hora de realizar trabajos con cadenas de texto, expongo aquí métodos en Java para que, en una cadena de caracteres, solo exista un espacio entre cada palabra y la cadena empiece y termine por una letra.

Una de las primeras formas que se nos podría ocurrir, sería la siguiente:

String cadena = new String("   Hola   esto es   una prueba      ");
cadena = cadena.trim();
String[] nueva = cadena.split(" +");

De esta forma, tendríamos un array de cadenas que corresponderían a la frase original, y, a la hora de reconstruir la frase podríamos realizarlo de la siguiente manera:

StringBuffer frase = new StringBuffer();
frase.append(nueva[0]);
for(int i = 1;i < nueva.length;i++)
    frase.append(" " + nueva[i]);

Lo que estamos realizando en este código es: en primer lugar llamamos al método trim() de la clase String, que elimina espacios por delante y por detrás de la cadena en caso de que los haya. Posteriormente llamamos al método split() y le pasamos como parámetro una expresión regular, en este caso " +" que es una expresión regular que reconoce las cadenas que poseen uno o más espacios. A continuación recorremos el array devuleto por split y vamos concatenando en un StringBuffer (se podría realizar concatenando en una variable String con el operador +, pero por temas de eficiencia es preferible y muy recomendable realizarlo con StringBuffer).

De esta forma, en la variable frase, que es de tipo StringBuffer, tendríamos la cadena inicial, pero sin espacios al principio ni al final y además con un único espacio entre fases.

Este método es correcto y realiza su función, pero hemos tenido que escribir 6 líneas de código para realizarlo además de declarar un stringbuffer y parece que hemos tenído que darle demasiadas vueltas.


Una segunda forma de realizar este cometido podría ser la siguiente:

String texto = new String("    Hola    esto   es una prueba         de eliminar espacios  ");
texto = texto.replaceAll(" +", " ");
texto = texto.trim();

Lo que hacemos es reemplazar con el método replaceAll() todas las cadenas especificadas por el primer parámetro, que es una expresión regular, y las sustituimos por el segundo parámetro, es decir, reemplazamos todos los espacios por un único espacio. Por ejemplo, sí tenemos: "El         jamón     ", tras aplicar este método nos quedaría lo siguiente: "El jamón ". Por tanto, a continuación tan solo deberíamos aplicar el método trim() y conseguiríamos lo que andábamos buscando.

En este caso, tenemos tan solo dos líneas de código (no cuento la declaración del objeto) y de nuevo realiza correctamente su cometido. Incluso de esta manera sería más eficiente que la propuesta anteriormente.

Una última forma podría ser empleando la clase StringTokenizer, y sería de la siguiente manera:

String texto = new String("    Hola esto   es  una prueba      de     eliminar      espacios                    ");
StringTokenizer tokenizer = new StringTokenizer(texto, " ");
StringBuffer frase = new StringBuffer();
if(tokenizer.hasMoreTokens()){
    frase.append(tokenizer.nextToken());
    while(tokenizer.hasMoreTokens())
        frase.append(" " + tokenizer.nextToken());
}

De nuevo en la variable frase, tendríamos el contenido.

Aquí estamos declarando una variable de tipo StringTokenizer y le pasamos como parámetro al constructor el texto y el delimitador de cada token. Por último, si queremos reconstruir la frase hacemos lo especificado arriba y la conseguiríamos.

Este método no me agrada tanto como el anterior, ya que hay que realizar muchas más comprobaciones (la del if se ejecutará siempre y las del bucle while tantas como tokens hayan a partir del primero) además de que se realizan muchas más llamadas a métodos que en el anterior caso.

No puedo decir que una sea más eficiente que la otra ya que debería saber el coste de cada método, pero por intuición (cosa que puede estar equivocada) diría que el 2º método sería el más eficiente.

Espero que sea de utilidad a todo aquel que venga a parar aquí.

Saludos y suerte.

viernes, 1 de julio de 2011

Cambiar icono JFrame y JDialog.

Hola y buenos días para las personas que vengan a parar aquí.

El motivo de esta entrada es explicar un poco como cambiar el icono de las ventanas JFrame y JDialog, ya que sinceramente, me parece algo lioso para quién no lo sepa, y que muchas de las cosas que leí por internet solamente me funcionó una de ellas.

Para las clases que programemos que hereden de JFrame, es bastante sencillo realizar el cambio de icono.

En primer lugar vamos a redefinir el método getIconImage(), heredado de la clase JFrame. El código que insertaremos en este método será el siguiente:


public Image getIconImage() {
    Image retValue = Toolkit.getDefaultToolkit().
    getImage(ClassLoader.getSystemResource("resources/Cadenas.png"));

    return retValue;
}

Donde "resources/Cadenas.png" es la ruta donde se encuentra el icono que queremos establecer para nuestra ventana. El formato debe ser PNG, ya que en otros formatos da ciertos problemas.

También es recomendable que nuestros iconos se encuentren en un paquete de nuestro proyecto. En mi caso cree una carpeta llamada resources y dentro de ella metí la imagen del icono.

Una vez realizado esto, en el constructor de nuestra clase pondremos la siguiente instrucción:

setIconImage(getIconImage());

De esta forma cambiaremos el icono por el que indicamos en el método redefinido.

Ya tenemos nuestro JFrame con nuestro icono personalizado.

En los JDialog la cosa cambia, ya que por si solos ellos no poseen un icono. Para poder establecer un icono para los JDialog, debemos crear un JFrame, asignarle a este JFrame un icono (como hemos visto anteriormente) y, a la hora de crear nuestro JDialog, pasarle como padre el JFrame modificado. De esta forma tendremos nuestro JDialog con icono.

lunes, 20 de junio de 2011

La primera entrada.

Aquí da comienzo un blog donde iré colgando algunas mini-aplicaciones creadas por mí. La mayoría estarán hechas en Java, así que para quién le guste algún programilla que cuelgue, y además necesite o le interese la portabilidad, le vendrá genial.

Sin más rodeos un pequeño programa que he terminado hoy mismo. Es bastante simple aunque al menos tiene una pequeña interfaz gráfica. El programa realiza lo siguiente: Coge dos ficheros, uno de origen y otro de destino. El fichero de origen contendrá nombres, o palabras cada nombre o cada frase en una linea. Se irá al segundo fichero y buscará ese nombre o frase o número o lo que sea, y lo sustituirá por lo que nosotros queramos. Además tiene la opción de sustituirlos todas las coincidencias de una vez, o ir de una en una.

Por ejemplo si tenemos estos dos ficheros:

FICHERO 1                                                            FICHERO 2
-------------                                                            -------------

Pascual Antonio López                                             Perico de los palotes
29-10-1990                                                             Santiago Segura
Hola esto es una prueba                                            Pascual Antonio López
Fuckencio Segura                                                     29*10+5 = 295
29*10+5 = 295

recorrería todo el fichero 1 leyendo cada linea, encontraría en el fichero 2 "Pascual Antonio López" y la expresión aritmética y las sustituiría por lo que quisiésemos.

El programa no estará exento de fallos seguramente. Sí alguien lo descarga, prueba y desea hacer cualquier comentario acerca de alguna mejora o fallo, encantado.

Sustitución de cadenas:

Sustitucion de cadenas en Java


VERSIÓN NUEVA CON ALGUNAS MEJORAS:


Sustitución de cadenas en Java Versión actualizada

Esta versión incluye la opción de poder seleccionar varios archivos destino al mismo tiempo (manteniendo pulsado control y pinchando en los distintos ficheros), además de poder seleccionar una carpeta contenedora donde se encuentren los distintos ficheros a analizar.

Además, a la hora de hacer reemplazos de uno en uno existe la posibilidad de dejar la cadena tal cual está.

También se ha cambiado el icono de la aplicación y ahora se muestra en la barra de herramientas.

VERSIÓN ACTUALIZADA Y FINAL:


Sustitución de cadenas en Java versión final

Esta versión incluye una ventana de ayuda con especificaciones generales del programa. Además se han resuelto algunos problemas de las versiones anteriores y añadido nuevas funcionalidades.

Dos capturas de pantalla del programa en ejecución:

Ventana principal

Ejemplo ejecución