Java

Palíndromos en Java

Un palíndromo es una palabra, número o frase que se lee igual de izquierda a derecha o de derecha a izquierda. Un ejemplo clásico es “Dábale arroz a la zorra el abad”, o como dijeron en los Simpson “Anita lava la tina”. También palabras como “ala” o números como “2002″.

Lo que este código hace es leer una línea y ver si ordenándola de alguna manera se puede generar un palíndromo, por ejemplo “Yoga hoy yo hago” NO es un palíndromo, pero si lo ordenamos de esta forma “Yo hago yoga hoy” obtenemos una frase que SI es un palíndromo. Para hacer esto me resultó útil parte del código que publiqué en el post “Anagramas en Java” ya que lo que hago es probar todas las conjugaciones que se pueden hacer con las palabras de la frase ingresada y luego ver si alguna(s) de ellas es un palíndromo.

Es una solución que usa fuerza bruta y se puede mejorar fácilmente, por ejemplo detectando si para la primera palabra de una conjugación hay otra palabra que acabe con la misma letra (“Sx xxxx xx xx xx xxs”) y no hacer conjugaciones en vano, pero esa es otra historia.

Este código lee un número n de casos y luego imprime los parónimos que se pueden obtener ordenando las palabras de alguna manera. Para evitar palíndromos repetidos (por ejemplo si ponemos “a a b” podríamos tener 2 veces “a b a” – “a b a”) seguí la recomendación de Pedro en “Anagramas en Java” y almacené todos los palídromos en un Set y así evitamos los repetidos =D. Si no hay ningún palíndromo posible se muestra el mensaje “imposible”.

PD: El código no funciona con tildes (bienvenido el que quiera agregar los replace() ).

import java.io.*;
import java.util.HashSet;

public class Palindromos {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new
        InputStreamReader(System.in));
        System.out.println("Ingrese el numero de lineas:");
        int nro= Integer.parseInt(br.readLine());
        for (int i=0;i<nro;i++){
            String cadena=br.readLine();
            //Pasamos todas las letras a mayuscula para no hacer distincion
            cadena=cadena.toUpperCase();
            //Un arreglo con cada palabra
            String[] palabras=cadena.split(" ");
            //Una variable de control para el método recursivo
            //que se va a usar
            int veces=0;
            //Un arreglo de cadenas que se usará para
            //hacer conjugaciones
            String[] conjugacion= new String[palabras.length];
            //Un Set donde se almacenarán las conjugaciones
            //y permitirá identificar repetidos
            HashSet<String> palindromos=new HashSet<String>();
            //El méttodo recursivo
            conjugar(palabras, veces,conjugacion,palindromos);
            //Output
            if (palindromos.isEmpty()){
                System.out.println("imposible");
            }else{
                System.out.println("Palindromos encontrados: ");
                for(String pal:palindromos){
                    System.out.println("- "+pal);
                }
            }
        }
    }

    public static void conjugar(String[] palabras, int veces,
            String[] conjugacion, HashSet<String> palindromos){
        //Si la conjugacion está completa, probamos si es palíndromo
        if (veces==palabras.length){
            probarPalindromo(conjugacion,palindromos);
            return;
        }
        //Desde aquí es casi idéntico que el código del anagrama
        veces++;
        for (int i=0; i<=palabras.length-1;i++){
            if (palabras[i].compareTo("@")==0){
                continue;
            }else{
                String palabraAuxiliar=palabras[i];
                conjugacion[veces-1]=palabraAuxiliar;
                palabras[i]="@";
                conjugar(palabras,veces,conjugacion,palindromos);
                palabras[i]=palabraAuxiliar;
            }
        }
    }

    public static void probarPalindromo(String[] conjugacion,
            HashSet<String> palindromos){
        //Armamos una cadena en base al arreglo de Strings
        //La cadena no tendrá espacios entre letras,
        //ya que para ser palíndromo
        //estas no se toman en cuenta
        String cadena1="";
        for (String s:conjugacion){
            cadena1=cadena1+s;
        }
        int veces;
        //Luego lo pasamos a un arreglo de caracteres
        //para hacer las comparaciones
        //Esto se puede hacer de varias maneras
        char[] carac=cadena1.toCharArray();
        int longitud=carac.length;
        if (longitud % 2==0){
            veces=longitud/2;
        }else{
            veces=(longitud-1)/2;
        }
        //Una bandera que indica que no es palindromo
        boolean flagNoPalindromo=false;
        for(int i=0;i<=veces;i++){
            //La idea es comparar el primer caracter con el último
            //Luego el segundo con el penúltimo, etc etc
            if (carac[i]==carac[longitud-i-1]){
            }else{
                flagNoPalindromo=true;
            }
        }
        if (flagNoPalindromo==true){
            return;
        }
        //Armamos otra cadena, ahora los espacios entre letras
        String cadenaSalida="";
        for (String s:conjugacion){
            cadenaSalida=cadenaSalida+s+" ";
        }
        //Finalmente le damos un poco de formato y lo agregamos al Set
        String cadenaFormateada=cadenaSalida.substring(0,1)+
                cadenaSalida.substring(1,
                cadenaSalida.length()-1).toLowerCase();
        cadenaFormateada="\""+ cadenaFormateada+"\"";
        palindromos.add(cadenaFormateada);
    }
}

Anagramas en Java

Un anagrama es una palabra que resulta de la transposición de las letras de otra palabra. Por ejemplo con ifx podemos obtener ifx,ixf,fix,fxi,xif,xfi (saber cuales de estas son palabras reales es un asunto totalmente distinto …). Hacer un programa en java para obtener todas estas posibles conjugaciones no es difícil, pero es interesante porque se requiere usar un método recursivo y esta clase de métodos tiende a seguir el patrón pocas líneas de código bastante dolor de cabeza. Esta es sólo una manera de solucionar un anagrama, debe de haber varias más.

import java.util.ArrayList;

public class Anagrama {
    private ArrayList<String> soluciones=new ArrayList<String>();

    public Anagrama(){  }

    public static void main(String args[]){
        Anagrama a=new Anagrama();
        String palabra="ifx";
        a.resolver(palabra);
        System.out.println(a.getSoluciones());
    }

    public void resolver(String palabra){
        palabra=palabra.toLowerCase();
        char[] letras=palabra.toCharArray();
        int tamanioPalabra=letras.length;
        int numeroIteraciones=0;
        char[] cadenaActual=new char[letras.length];
        resolver(letras,cadenaActual,tamanioPalabra,numeroIteraciones);
    }

    private void resolver(char[] letras,char[] cadenaActual,
            int tamanioPalabra,int numeroIteraciones){
        if (numeroIteraciones==tamanioPalabra){
            getSoluciones().add(new String(cadenaActual));
        }
        numeroIteraciones++;
        for(int i=0;i<tamanioPalabra;i++){
            if (letras[i]=='A'){
                //Como se paso todas las letras a minúscula, se usa "A"
                //para indicar que la letra en esa posición ya se utilizó,
                //de ser así sólo paso a la siguiente letra
            }else{
                char valorEliminado=letras[i];
                //valorEliminado es la letra que ya use y no
                //se debe seguir usando
                cadenaActual[numeroIteraciones-1]=valorEliminado;
                letras[i]='A';
                //Un valor q le doy para mostrar que ya lo elimine
                resolver(letras,cadenaActual,tamanioPalabra,numeroIteraciones);
                letras[i]=valorEliminado;
            }
        }
    }

    public ArrayList<String> getSoluciones() {
        return soluciones;
    }

    public void setSoluciones(ArrayList<String> soluciones) {
        this.soluciones = soluciones;
    }

}

Apuntes de Java: Entrada de datos

Algo básico e importante de toda aplicación indiferentemente del lenguaje de programación, es sin duda alguna el nivel de interacción que se tiene con los usuarios, ya saben, toda la teoría que hay detrás del software a medida y las necesidades y requerimientos y todo eso que nos dicen; pero este post es para aquellos que no tienen idea de cómo comenzar con eso en sus aplicaciones por consola que, si han seguido los apuntes y sólo los apuntes de java de este blog, sólo saben imprimir textos en consola.

Pues bien, en este post voy a usar un poco lo básico de ingresar datos por consola y tomarlos como referencia para creación de variables, es algo fácil, no se preocupen.

Seguir leyendo …

Aplicando overwriting en componentes swing

Si hablamos de programación orientada a objetos, pues tambien tenemos que hablar de polimorfismo. El polimorfismo se podría dividir concretamente en dos sustantivos: sobreescritura (overwriting) y sobrecarga (overriding) de métodos, los cuales forman parte importante en la implementación del api del j2se.

Estos dos conceptos no son muy dificiles de entender, sin embargo, el ver la puesta en escena de estos conceptos se da casi siempre en nuestras propias clases, lo cual es sencillo ya que para nosotros nuestra clase es una caja blanca la cual podemos ver claramente. Lo que voy a mostrar ahora, es como aplicar la sobreescritura de métodos en la API del J2SE y para hacerlo aun mas grafico, lo aplicaré sobre la clase JFrame, la cual es una ventana de las normales que todos podemos ver.

A continuación pondré el código del programa:

Seguir leyendo …

Apuntes de Java: Manejo de Excepciones

El manejo de excepciones es una de la características que mas robusto hace al lenguaje de programación java. Claro, que esto viene de su papá C++ y creo que actualmente también lo implementan lenguajes como Visual Basic.

Bueno, últimamente ando programando en java, c y c++, simultáneamente. Así que a veces se me cruzan los cables con ambos lenguajes. Lo que voy a postear ahora son errores que -creo yo- son comunes a la hora del manejo de excepciones, ya que cuando andaba programando, se me fueron esas nociones de las excepciones.

En realidad, tengo solo dos apuntes que hacer.

La primera: Tener cuidado con el NullPointerException y de como estas están programadas en la API del J2SE.

  • Como sabemos, la excepción NullPointerException es “tirada” cuando un objeto apunta a nulo (si queremos verlo desde el punto de vista de punteros de C).
  • Ahora, veamos un ejemplo de como funciona esto en el siguiente método.

Seguir leyendo …

Jugando con mi auto R/C

Desde chibolo siempre me han gustado los autos a control remoto, sin embargo, nunca tuve uno. En la navidad pasada, se me dio por comprarme uno simple en radioshack y me salió un poco mas de 50 soles con baterías y todo.

Estuvimos jugando con el carrito toda la noche buena yo y mi primo de 12 años xD. Al día siguiente, ya me había aburrido un poco, así que se me dio por desarmar el control remoto para ver el circuito =P. Y pues –como no se mucho de electrónica- entendí solo el 10% del circuito, lo cual fue suficiente para poder darme cuenta que el auto se movía con la presión de 2 pares de interruptores.

P1050290

Seguir leyendo …

Controlar puerto paralelo desde java

Controlar el puerto paralelo es bastante sencillo con algunas funciones que ya tienen predefinidos algunos compiladores de C++. Por ejemplo, turbo c++ trae outport() e inport() para acceder a diversas direcciones de puerto.

Lo que hice esta vez, fue simplemente linkear dichas funciones a java mediante el JNI (Java Native Interface). A continuación les adjuntaré el jar con la pequeña biblioteca que hice y también algunos ejemplos simples probados con un led, cualquier consulta ponerla aquí abajito =D.

Olvidaba algo importante para cuando el proyecto tenga mas de 1 clase y/o paquetes (sino no es necesario), que para que corran los programas sin ningún inconveniente se debe poner el método: Port.loadLibrary() en la primera línea del main de su programa (incluso pueden agregarlo en “agregar biblioteca” de netbeans) y claro poner los dlls visibles para los .class de su programa puedan encontrarlos. El dll que creé fue el Port.dll que esta en el jar y el otro es clbr18.dll que es propio del compilador que use que fue OpenWatcom. Claro todo esta en la carpeta “Examples” del rar que pondré aquí abajo =D.

NOTA: Otra opcion es poner los dlls Port.dll y clbr18.dll dentro de la carpeta bin de su JDK, que en mi caso es el siguiente: C:\Archivos de programa\Java\jdk1.6.0_16\bin. Aparte tambien hay muchas mas opciones para setear el java.library.path, solo estoy nombrando las -que a mi parecer- son mas comodas.

Libreria JAR + DLLs (para agregar a proyectos de Netbeans)

Libreria Jar+ Source Code + Ejemplos

Solo ejemplos

Encontrar la ruta del JDK

Encontrar la ruta del JDK es bastante simple. Solo tienen que ir al explorador de windows, archivos de programa, java, … mentira! es una broma xD. Bueno en el código también es bastante simple, solo que cuando lo empaquetas en un jar, en lugar de mostrarte la ruta del JDK te muestra la del JRE, lo cual yo no quería en el tiempo que hice esto, ya que necesita algunas herramientas del kit de desarrollo, como el compilador (javac).

Para solucionar este problema hice un pequeño método para que busque la ruta del jdk. Claro que no lo voy a hacer una búsqueda por todo el disco duro, sino que me basaré en el System.getProperty(“java.home”) y luego buscaré las diferentes versiones y actualizaciones, ya que por decir en mi pc tengo la siguiente version: jdk1.6.0_16 y bueno no es algo muy complicado, pero para mi me fue muy útil :D .

Aquí esta el código:

Seguir leyendo …

Creando un simple navegador Web Con Java

image Estos últimos días sin post’s me puse emocional y como quien no quiere la cosa me empecé a quejar de todo y casi todos XD …pero bueno… ayer en un día perfecto de clima y de ánimos me puse a retomar algo de la programación, y charlando con Clayder nos dimos cuenta que tenemos mucho material como para postearlo aquí, así que pues ahora empezaremos con algo tan simple y que se ve tan complejo como lo es crear un navegador web con java, cabe recordar que Java está bien posicionado entre la gente porque tiene una inmensidad de usos entre los que destaca el uso web, y algunos de sus controles en Swing se adaptan perfectamente a los requerimientos que se establezcan en el programa… es así, que en este caso usaremos la librería JavaNet y el control TextPane para hacer un simple y sencillo navegador java… Pero ya fuera de floro vamos con los procedimientos

Seguir leyendo …

JTwitter, Librería de Twitter para Java

twitterplusjava Hasta hace algún tiempo estuve experimentando una librería en una aplicación java que salió como un proyecto improvisado, pero como que no me convencía… era muy alrevesada y muy complicada (por el hecho de que te confundías fácilmente de nombres de clases, métodos y tipos) pero yo seguía dándole ahí, hasta que llegue a un estado del que ya no pude salir… y bueno… esa librería de la que les hablo se llama Twitter4J y la aplicación que hice, la bauticé Twill.

Quería hacerla a lo grande, pero creo que al final me ahogué en la sopa del código, era demasiado extensa, demasiadas funciones, demasiadas formas de verla, demasiado JavaDoc (Para la categoría de proyecto chico) y algunos métodos se superponían a otros entre otras cosas, aunque con esto no quiero decir que sea mala, sino que, era demasiado para mi proyecto que sólo hacía lo básico para un cliente Twitter (Mi aplicación) hecho por una sola persona.

Últimamente en mis navegadas a la nube, encontré otra herramienta mucho más flexible, y no tan extensa como la anterior, de la que creo que podría ser útil a aquellos que estén interesados en la API de twitter para cualquier fin, porque aparte, sólo encontré información directamente del fabricante (si buscas en Google encontrarás información de un cliente Twitter Para celulares, con el mismo nombre) y estuve deduciendo el Código en una versión mejorada de mi aplicación… Tiene funciones básicas e intermedias, el JavaDoc es sencillo y no hay tantas funciones que, dicho sea de paso, están demasiado bien nombradas… En este post voy a enseñar como implementar tal librería a cualquier aplicación vía NetBeans y a enseñarles algunos ejemplos de como pueden interactuar con su librería, pero pues, la posibilidad está abierta a extenderte y sacar tu propio cliente XD… Que creo.. también existe una versión para C++ y .NET (No las he probado…)

Seguir leyendo …