Patrones de Diseño

Patrón Abstract Factory

19/Mar/2013

Hoy les voy a presentar el Patrón Abstract Factory junto con un ejemplo simple hecho en Java. Esto se enmarca dentro de la serie de Patrones de Diseño sobre la que vamos air hablando.

Abstract Factory

El patrón Abstract Factory nos permite crear, mediante una interfaz, conjuntos o familias de objetos (denominados productos) que dependen mutuamuente y todo esto sin especificar cual es el objeto concreto.

¿Que usos tiene el patrón Abstract Factory?

Este patrón se puede aplicar cuando:

  • Un sistema debe ser independiente de como sus objetos son creados.
  • Un sistema debe ser ‘configurado’ con una cierta familia de productos.
  • Se necesita reforzar la noción de dependencia mutua entre ciertos objetos.

Estructura del Patrón Abstract Factory

Patrón Abstract Factory

El asterisco (*) representa que la clase/operación es abstracta.

Elementos del Patrón Abstract Factory

    FabricaAbstracta*: Define un conjunto de métodos (interfaz) para la creación de productos abstractos.
  • FabricaConcreta1/2: Implementa la interfaz de la FabricaAbstracta para la creación de los distintos productos concretos.
  • ProductoAbstractoA*/B*: Define la interfaz de los objetos de tipo ProductoA/B.
  • ProductoConcretoA1/A2/B1/B2: Implementan su respectiva interfaz representando un producto concreto.

Pros/Contras del Patrón Abstract Factory

  • + Brinda flexibilidad al aislar a las clases concretas.
  • + Facilita cambiar las familias de productos.
  • – Para agregar nuevos productos se deben modificar tanto las fabricas abstractas como las concretas.

Ejemplo del Patrón Abstract Factory

Teniendo en cuenta la siguiente jerarquía de clases, la cual trata de representar muy por arriba dos familias de productos (DVD y BluRay) cada uno con un par de variantes (simple y doble capa) para que permiten mostrar diferentes aspectos a tener en cuenta a la hora de usar este patrón.

Ejemplo del Patrón Abstract Factory

Vemos como sería el producto abstracto:

public abstract class Disco implements Prototipo {
    @Override
    public abstract Prototipo clone();

    public abstract String getCapacidad();

    public abstract String getNombre();

    public abstract String getPrecio();

    @Override
    public String toString() {
            return getNombre() + " (" + getCapacidad() + ")";
    }
}

El producto DVD extendemos del Disco

public abstract class DVD extends Disco {
...
}

Y el producto concreto del DVD extenderá de la anterior clase:

public class DVD_CapaSimple extends DVD {

    @Override
    public Prototipo clone() {
            return new DVD_CapaSimple();
    }

    @Override
    public String getCapacidad() {
            return "4.7GB";
    }

    @Override
    public String getNombre() {
            return "DVD Capa Simple";
    }

    @Override
    public String getPrecio() {
            return "5.00$";
    }

}

Vamos a construir un AbstractFactory que nos permita crear discos de DVD o BluRay de simple y doble capa usando el siguiente diseño:

Ejemplo de Patrón Abstract Factory

La factoría abstracta la definiríamos mediante un interface:

public interface FabricaDiscos {

        public BluRay crearBluRay();
        public DVD crearDVD();
}

Y sobre ese interface implementamos una de las fábricas concretas, en este caso la de FabricaDiscos_CapaSimple:

public class FabricaDiscos_CapaSimple implements FabricaDiscos {

       @Override
       public BluRay crearBluRay() {
               return new BluRay_CapaSimple();
       }

       @Override
       public DVD crearDVD() {
               return new DVD_CapaSimple();
       }

}

Veamos como quedaría el código fuente en Java para utilizar el patrón Abstract Factory:

FabricaDiscos fabrica;
DVD dvd;
BluRay bluray;

fabrica = new FabricaDiscos_CapaSimple();
dvd = fabrica.crearDVD();
bluray = fabrica.crearBluRay();

System.out.println(dvd);
System.out.println(bluray);

fabrica = new FabricaDiscos_CapaDoble();
dvd = fabrica.crearDVD();
bluray = fabrica.crearBluRay();

System.out.println(dvd);
System.out.println(bluray);

En el código vemos que sobre la fábrica podemos crear objetos de diferentes tipos y que podríamos ir creciendo en productos atendiendo a nuestras necesidades.

fabrica = new FabricaDiscos_CapaSimple();
dvd = fabrica.crearDVD();
bluray = fabrica.crearBluRay();

Espero que hayáis podido apreciar la flexibilidad que nos brinda el patrón Abstract Factory.

Patrones de Diseño

Patrones Creacionales

18/Mar/2013

A lo largo de los próximos días vamos a revisar en Línea de Código diferentes Patrones de Diseño. Algo muy importante y que todo desarrollador debería conocer. En el primer ciclo vamos a revisar los Patrones Creacionales.

¿Qué es un Patrón de Diseño?

Un patrón de diseño es un conjunto de objetos y clases organizados de cierta forma que ayudan a resolver un problema recurrente en el diseño de un software de una forma limpia y reusable.

Según el libro Design Patterns: Elements of Reusable Object-Oriented Software, a los patrones se los puede clasificar en tres categorías:

  • Patrones Creacionales: Procuran independizar al sistema de como sus objetos son creados y/o representados.
  • Patrones Estructurales: Se refieren a como las clases y los objetos son organizados para conformar estructuras más complejas.
  • Patrones de Comportamiento: Se centran en los algoritmos y en la asignación de responsabilidades entre los objetos.

Patrones Creacionales

En este caso, nos vamos a concentrar en los patrones creacionales, estos patrones buscan en cierta forma «despreocupar» al sistema de como sus objetos son creados o compuestos.

Los patrones que iremos viendo y desarrollando las próximas semanas son:

  • Abstract Factory, permite trabajar con objetos de diferentes familias de manera que no se mezclen entre sí. De esa manera se consigue la el tipo de familia que se esté utilizando sea transparente.
  • Builder, abstrae el proceso de creación de los objetos complejos, centralizandolo en pun punto.
  • Factory Method, centraliza en una clase constructora la creación de objetos de un tipo determinado. Ocultando al invocante la necesidad de indicar un tipo u otro.
  • Prototype, crea un objeto a partir de la clonación de un objeto ya existente.
  • Singleton, garantiza que solo exista una instancia de un objeto y que la forma de acceder a dicha instancia sea general.
Artículos
Java

Criptografía: Algoritmos de Digestión de Mensajes

04/Feb/2013

¡Buenas! Hoy les voy a traer algunos conceptos de encriptación y cómo Java los soporta.

Supongamos que tenemos una aplicación en la que almacenamos información confidencial y no queremos que sea mostrada como texto plano o en el código de la aplicación, entonces es aquí donde entra la criptografía.

Dentro de la criptografía existen varios algoritmos con diferentes características. Nosotros hoy veremos los Algoritmos de Digestión de Mensajes o de Hash acompañados de una pequeña implementación sobre su uso en Java.

Algoritmos de Digestión de Mensajes

Estos algoritmos son tales que, a partir de un mensaje y mediante ciertas operaciones matemáticas, generan otro mensaje denominado ‘Huella Digital’ (que según el algoritmo que usemos puede ser de tamaño fijo o no) que cumple con las siguientes características:

  1. Es incomprensible a simple vista.
  2. Cada huella es única para cada mensaje.
  3. Dos huellas son iguales si y solo si el mensaje original también lo es.
  4. Es unidireccional, es decir que no se puede reconstruir el mensaje original a partir de su huella digital.

Usaremos este método para probar los distintos algoritmos de digestión que soporta Java mediante la clase MessageDigest:

    public static String digest(String str, String alg) {
        try {
            MessageDigest md = MessageDigest.getInstance(alg); 
            // Indicamos el algoritmo a usar
		
            return new String(md.digest(str.getBytes()));
            // 'Digerimos' el mensaje
        } catch (NoSuchAlgorithmException e) {
            System.out.println("el algoritmo " + alg + " no existe");
            return null;
        }
    }

Algoritmos y sus resultados:

 ·MD2:    digest("lineadecodigo", "MD2")     -> zA��&�#K��F%5
 ·MD5:    digest("lineadecodigo", "MD5")     -> �e����_m9E	�S�*
 ·SHA1:   digest("lineadecodigo", "SHA-1")   -> &�4!�7�Rr�6/�fs�
 ·SHA256: digest("lineadecodigo", "SHA-256") -> c�� �j 21��?։��*����,l���
 ·SHA384: digest("lineadecodigo", "SHA-384") -> pNƒ+���u��w�g;���� �:Yc�(
 ·SHA512: digest("lineadecodigo", "SHA-512") -> O� ֐���i�Q�>��G�8���o�C[:-�ga4:�n3hg�Ѻ�"�o~�Ǡ�#0�(�

Incomprensible, ¿verdad? ¡Esa es la idea! Pero… ¿cómo se usan?

La idea del siguiente ejemplo hace hincapié en las propiedades de las huellas digitales mencionadas anteriormente:

Supongamos que tenemos una aplicación en la que se requiere que los usuarios se identifiquen mediante Nombre de Usuario y Contraseña, y que a su vez estos datos deben estar guardados en algún medio de almacenamiento como archivo/s o una base de datos.

El problema surge con las contraseñas, ya que por ninguna razón estas pueden estar en texto plano, por lo que una buena opción seria encriptarlas mediante algunos de los algoritmos mencionados previamente y mantenerlas almacenadas de esta forma.

Dicho esto, nos remitimos al ejemplo:

Para hacer las cosas más simples vamos a representar nuestro almacenamiento como un Mapeo o Mapa de Usuarios(String) a Contraseñas(String).

Primero que nada, debemos crear el almacenamiento de prueba para el ejemplo:

    // Almacenamiento de los datos de los usuarios
    protected Map usuarios;

    public EjemploLogin() {
        usuarios = new HashMap();

        // Se usara el algoritmo SHA-256 (usuarioX -> passwordX)
        usuarios.put("usuario1", "���D*ƅ�A���M=2�{�5D/i��N");
        usuarios.put("usuario2", "l�ռ��x5*�3`�?�N���Y���H]xp�");
        usuarios.put("usuario3", "Y�6~-(de�e�뵬?Z�U");
        usuarios.put("usuario4", "�xs�s���օ��^_��ϸ>�&�f@��8P+");
    }

Si te preguntas porque declaré al mapeo con esto: <String, String> te invito a que leas sobre tipos genéricos en Java, un tema realmente interesante y extremadamente útil, sobre todo para reutilización de código :)

Una vez hecho esto, deberíamos brindar un servicio que permita a un usuario acceder al sistema mediante su nombre de usuario y su contraseña:

    public boolean login(String usuario, String password) {
        // Obtenemos la huella digital de su contraseña almacenada
        String huella_password = usuarios.get(usuario);

        // Comprobamos que esta existe
        if (huella_password == null)
            return false;
        else {
            // Digerimos la contraseña ingresada
            String huella = Digestion.digest(password, "SHA-256");

            // En caso de que las huellas sean iguales por la propiedad 3 sabemos
            //     las contraseñas también lo son.
            return huella_password.equals(huella);
        }
    }

Recuerden siempre ser consistentes y usar el mismo algoritmo de digestión tanto al generar las huellas para almacenar como al generarlas para hacer la comprobación.

Finalmente, les dejo unos casos de prueba para que verifiquen si todo salió bien:

    login("usuario1", "password1"); -> true
    login("usuario2", "123456789"); -> false
    login("usuario3", "password3"); -> true
    login("usuario4", "abcdefghi"); -> false

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

Obtener cantidad de email sin leer en GMail con Java

02/Feb/2013

Hoy les traigo una forma fácil de obtener la cantidad de mails sin leer en nuestra casilla de Gmail con Java; en este caso, usaremos la librería JavaMail la cual es bastante conocida y se han hecho muchas publicaciones en Linea de Código y también usaremos el protocolo imaps.

Para empezar debemos establecer ciertos atributos que son necesarios para la conexión (usuario, password, servidor), los cuales los estableceremos mediante un constructor:

public Gmail(String user, String pass) {
  this.user = user + "@gmail.com";
  this.pass = pass;
  this.host = "imap.gmail.com";
}

Una vez identificados y establecidos estos elementos podemos proceder con la conexión al buzón de correo.

La conexión que realizamos es del tipo imaps. Es por ello que se asignamos dicho valor a la variable del protocolo:

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");

Ahora creamos una sesión mediante la clase Session y realizamos la conexión:

Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps"); 
store.connect(host, user, pass);

Es importante indicar que la carpeta de la que queremos la información es el inbox. Es por ello que utilizamos el método .getFolder() para indicar dicha carpeta.

inbox = store.getFolder("Inbox");

El código de conexión es el siguiente:

public boolean connect() {
  try {
    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imaps"); 

    Session session = Session.getDefaultInstance(props, null); 
    Store store = session.getStore("imaps"); 
    store.connect(host, user, pass); 

    inbox = store.getFolder("Inbox"); 
    // Obtenemos la casilla de entrada como carpeta a analizar

    return true; 
  } catch (Exception e) {
    e.printStackTrace();
    return false; 
  }
}

Ya estamos conectados a GMail, ahora lo único que nos falta es obtener la cantidad de correos sin leer.

Abrimos el INBOX mediante el metodo open. Lo abrimos de solo lectura Folder.READ_ONLY.

inbox.open(Folder.READ_ONLY);

El método .getUnreadMessagesCount() nos dice el número de mensajes que tenemos sin leer.

int count = inbox.getUnreadMessageCount(); 

Metemos toda la consulta de mensajes no leidos en un método para que quede más sencilla de leer:

public int getUnreadMessageCount() {
  try {
    inbox.open(Folder.READ_ONLY); 
    int count = inbox.getUnreadMessageCount(); 
    inbox.close(false);
    return count;
  } catch (Exception e) {
    System.out.println(e);
    return -1;
    // En caso de una excepción retornamos -1
  }
}

Y para finalizar, les voy a mostrar cómo sería el flujo básico de ejecución de este programa para obtener cantidad de email sin leer en GMail con Java:

public static void main(String[] args) {
  Gmail gmail = new Gmail("USER", "PASS");
  gmail.connect();

  System.out.println("Unread: " + gmail.getUnreadMessageCount());
}

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

String: Primera letra de cada palabra en mayúscula

07/Ene/2013

¡Buenas! Como entrega final del set de 5 ejemplos de manipulación de cadenas de caracteres les voy a presentar una forma de poner la primera letra de cada palabra en mayúscula en una cadena de caracteres (se considerará como palabra todo aquel substring que siga después de un espacio, punto o coma).

En el ejemplo partimos de la siguiente cadena de caracteres:

hola mundo, esto es lineadecodigo

Lo que esperamos obtener es una cadena de caracteres con la siguiente forma:

Hola Mundo, Esto Es Lineadecodigo

Para poder hacer esto necesitamos obtener mediante el método toCharArray de la clase String, el arreglo de caracteres correspondiente a la cadena que queremos modificar.

char[] caracteres = cadena.toCharArray();

Una vez hecho esto, antes que nada, dadas las condiciones en las que son consideradas las «palabras» debemos establecer que en el inicio de la cadena puede existir una palabra que no cumplirá con nuestras condiciones (es decir, espacio, punto o coma), por lo que tendremos que representar esta condición de la siguiente forma:

caracteres[0] = Character.toUpperCase(caracteres[0]);

Mediante el uso del método toUpperCase de la clase Character, podremos obtener el carácter en mayúscula correspondiente al indicado; de esta forma no tendremos que hacerlo nosotros mismos, lo que se conoce como ‘Reinventar la rueda’. :)

Luego, podremos analizar el resto de la cadena, y esto será recorriendo todo el arreglo que obtuvimos anteriormente de la siguiente forma:

// el -2 es para evitar una excepción al caernos del arreglo
  for (int i = 0; i < cadena.length()- 2; i++) 
    // Es 'palabra'
    if (caracteres[i] == ' ' || caracteres[i] == '.' || caracteres[i] == ',')
      // Reemplazamos
      caracteres[i + 1] = Character.toUpperCase(caracteres[i + 1]);

Finalmente, con el arreglo de caracteres modificado retornamos un nuevo String creado a partir de él:

return new String(caracteres);

Ya hemos conseguido poner la primera letra de cada palabra en mayúscula mediante Java.

Ejemplos de manejo de String

Puedes repasar los cinco ejemplos que hemos explicado sobre le manejo de cadenas String en Java.

  1. Cortar Cadena por Puntos
  2. Convertir cadena a mayúsculas hasta encontrar un punto
  3. Reemplazar cadenas
  4. Quitar saltos de linea de un texto
  5. Primera letra de cada palabra en mayúscula

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

String: Quitar saltos de línea de un texto con Java

05/Ene/2013

¡Buenas! Como cuarta entrega del set de ejemplos de manipulación de cadenas de caracteres en Java les voy a mostrar cómo quitar saltos de línea de un texto con Java.

Primero que nada debemos tener en cuenta que los saltos de línea en Java son representados con el carácter ‘\n’, teniendo esto en cuenta podemos hacer uso del método replaceAll de la clase String (el cual es explicado en el artículo Reemplazar cadenas con Java) para resolver esto:

En este caso el ejemplo para quitar saltos de línea de un texto con Java parte de que dada la siguiente cadena de caracteres:

hola mundo,
esto es:
www.lineadecodigo.com 

Lo que esperamos obtener es una cadena de caracteres con la siguiente forma:

hola mundo,esto es:www.lineadecodigo.com

El procedimiento es similar al explicado en el artículo Reemplazar cadenas con Java solo que en este caso los argumentos para el reemplazo son fijos:

public String quitarSaltos(String cadena) {
  // Para el reemplazo usamos un string vacío 
  return cadena.replaceAll("\n", ""); 
}

Vemos como unas pequeñas líneas de código fuente nos ayudan a quitar saltos de línea de un texto con Java.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

String: Reemplazar cadenas con Java

03/Ene/2013

¡Buenas! Como tercer ejemplo del set de manipulación de cadenas de caracteres les voy a mostrar como reemplazar cadenas con Java, es decir, reemplazar subcadenas por otras en una cadena de caracteres utilizando Java.

El ejemplo partirá de la siguiente cadena de caracteres:

www.lineadecodigo.com

Ahora, si quisiéramos reemplazar la subcadena ‘lineadecodigo’ por la cadena ‘aulambra’, lo que esperamos obtener es una cadena de caracteres con la siguiente forma:

www.aulambra.com

Para poder reemplazar cadenas con Java primero usaremos el método replaceAll de la clase String, el cual toma como argumentos un String o Expresión Regular y un String de reemplazo, y en todas las apariciones del primer argumento se pondrá al segundo argumento en su lugar.

public static String reemplazar(String cadena, String busqueda, String reemplazo) {
  return cadena.replaceAll(busqueda, reemplazo);
}

Ahora tendremos que invocar a este método pasándole las dos cadenas comentadas anteriormente:

String sURL = "http://www.lineadecodigo.com";
String sNuevaURL = reemplazar(sURL,"lineadecodigo","aulambra");
System.out.println(sNuevaURL);

Cabe destacar que también podemos utilizar el método replace para reemplazar todas las apariciones de un carácter por otro y el método replaceFirst para reemplazar solo la primera aparición del primer String por el segundo.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

String: Convertir cadena a mayúsculas hasta encontrar un punto

01/Ene/2013

¡Buenas! Como segundo ejemplo del set de manipulación de cadenas con Java de caracteres les voy a mostrar una forma de convertir cadena a mayúsculas hasta encontrar un punto.

El ejemplo de convertir cadena a mayúsculas hasta encontrar un punto busca que dada la siguiente cadena de caracteres:

www.lineadecodigo.com

Lo que esperamos obtener es una cadena de caracteres con la siguiente forma:

WWW.lineadecodigo.com

Para convertir cadena a mayúsculas hasta encontrar un punto primero debemos obtener el índice de la primera aparición de un punto. Para esto usaremos el método indexOf de la clase String de la siguiente forma:

int indiceDePunto = cadena.indexOf('.');

Una vez hecho esto, sabemos exactamente en que posición se encuentra el primer punto. Ahora debemos considerar que el método indexOf retorna -1 (menos uno) si no se pudo encontrar el carácter que se buscaba, teniendo esto en cuenta yo opte por transformar toda la cadena a mayúsculas mediante el metodo .toUpperCase().

if(indiceDePunto < 0)
  return cadena.toUpperCase();

En caso de que el índice sea válido (es decir que está entre 0 y la longitud de la cadena – 1) procedemos a obtener la subcadena que sera convertida a mayúsculas y la subcadena que no debe ser modificada. Para obtener las subcadenas haremos uso del método substring de la clase String, en el cual se indican el índice de inicio y fin de la subcadena.

// Subcadena a modificar
String inicioHastaPunto = cadena.substring(0, indiceDePunto); 

// Subcadena que no debe ser modificada
String restoDespuesDePunto = cadena.substring(indiceDePunto, cadena.length()); 

// Subcadena modificada
String inicioHastaPuntoConMayus = inicioHastaPunto.toUpperCase();

Finalmente, retornamos la cadena resultante como la concatenación de la subcadena modificada y la subcadena que no debía ser modificada:

return inicioHastaPuntoConMayus + restoDespuesDePunto;

Ya tenemos convertida nuestra cadena a mayúsculas con Java hasta el primer punto que hayamos encontrado.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

String: Cortar cadena por puntos

30/Dic/2012

¡Buenas! Este será el primer ejemplo de un set de 5 ejemplos sobre manipulación de cadenas de caracteres, específicamente, la clase String de Java. En este primer ejemplo vamos a ver cómo cortar cadena por puntos con Java.

A modo de introducción, debemos tener en cuenta que no existe ningún método provisto por la clase String de Java que modifique al String que recibe el mensaje, sino que se retornará un String nuevo con el resultado de la operación.

Para empezar, dada una cadena de caracteres con subcadenas separadas por puntos, les voy a mostrar cómo obtener esas subcadenas.

El ejemplo de cómo cortar cadena por puntos busca que dada la siguiente cadena de caracteres como puede ser

www.lineadecodigo.com

Obtengamos la partes que lo componen y que se separan por puntos:

[www]
[lineadecodigo]
[com]

Para poder lograr esto haremos uso del método split de la clase String de la siguiente forma:

public String[] cortarCadenaPorPuntos(String cadena) {
  return cadena.split("\\.");
}

Cabe aclarar que en el método split se usan Expresiones Regulares, es por esta razón que usamos «\\.», ya que el punto es un carácter especial en las Expresiones regulares y su fin es representar un carácter cualquiera; debido a esto debemos hacer uso de «\\» para indicar que realmente es el carácter punto el que buscamos y ningún otro.

Una vez que tengas el arreglo de subcadenas podéis recorrerlo de las siguientes formas:

Lo podemos recorrer mediante un simple bucle for:

    String [] arreglo = cortarCadenaPorPuntos("www.lineadecodigo.com");
    for(int i = 0; i < arreglo.lentgh; i++) 
        System.out.println(arreglo[i]);

O bien utilizar un b bucle for each.

    String [] arreglo = cortarCadenaPorPuntos("www.lineadecodigo.com");
    for(String s : arreglo) 
        System.out.println(s);

Recuerda que el bucle for each puede ser usado con cualquier instancia de la interfaz Iterable

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

Gráficos de torta y barras con JFreeChart

31/May/2012

El otro día veíamos como crear, de una forma sencilla, un gráfico con JFreeChart. Hoy les presento una forma muy fácil para crear y mostrar un gráfico de torta y uno de barras en Java con JFreeChart.

Recordar que lo primero es descargarse las librerías de JFreeChart. Vamos a necesitar las siguientes librerías JFreeChart y JCommon

Una vez que estén importados los respectivos .jar podremos comenzar a ver el código.

Una forma fácil que se me ocurrió para mostrarles el funcionamiento de esta librería fue crear unos 10000 números aleatorios entre 0 y 9 y llevar un registro de cuantas veces apareció cada número. Para esto tenemos el siguiente código:

Random rnd = new Random(System.currentTimeMillis());
// Establece una semilla para el random
int[] array = new int[10];
for (int i = 0; i < 10000; i++)
  array[rnd.nextInt(10)]++;

Cada vez que el random da un numero, se aumenta en uno la cantidad de veces que fue dado. Una vez finalizado el algoritmo tenemos un arreglo donde en cada índice se indica cuantas veces surgió ese índice del random.

Luego, procederemos a crear el gráfico de torta en base a nuestro arreglo con JFreeChart. Lo tendremos todo en el método crearGraficoTorta.

private static JPanel crearGraficoTorta(int[] array) {...} 

Lo primero será crear un dataset donde vamos a almacenar las distintas ‘porciones’ de la torta. Es por ello que utilizamos una clase DefaultPieDataSet de JFreeChart.

DefaultPieDataset dataset = new DefaultPieDataset();
for (int i = 0; i < array.length; i++)
  dataset.setValue("Valor " + i + ": " + array[i], array[i]);

Utilizamos un bucle for para agregar las ‘porciones’ a nuestro grafico de torta. El ultimo parametro indica el valor de la torta que ocupa cada porcion.

Luego, en base a este dataset, creamos nuestro gráfico. Utilizamos la factoría de creación de gráficos de JFreeChart, la ChartFactory.

JFreeChart chart = ChartFactory.createPieChart("Repeticion de randoms",
  dataset, true, true, true);

Podemos hacer algunas mejoras sobre el propio gráfico con JFreeChart como añadirle un fondo o quitar la leyenda:

chart.setBackgroundPaint(Color.white);
chart.removeLegend();

Finalmente, retornamos un panel que contenga a esa torta.

Ahora, procederemos a crear el gráfico de barras en base a nuestro arreglo.

private static JPanel crearGraficoBarras(int[] array) {...}

Volvemos a crear un dataset donde vamos a almacenar las distintas ‘barras’. En este caso es un DefaultCategoryDataSet.

DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String serie = "Numeros";
for (int i = 0; i < array.length; i++)
  dataset.addValue(array[i], serie, "" + i);los valores son añadidos al DataSet con un addValue().

Una vez completado el dataset, se crea el grafico de barras en base a el.

JFreeChart chart = ChartFactory.createBarChart("Repeticion de randoms", null, 
  null, dataset, PlotOrientation.HORIZONTAL, true, true, false);

Para terminar debemos agregar los gráficos a un frame para poder verlos:

JFrame frame = new JFrame("CrearGraficos - LineaDeCodigo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(2, 1));
frame.add(crearGraficoTorta(array));
frame.add(crearGraficoBarras(array));
frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true);

En este código hemos añadido los gráficos mediante el método .add() del JFrame. Adicionalmente hemos redimensionado el tamaño del frame, al minimo posible con el método .pack() y centrado el frame con .setLocationRelativeTo(null).

Nuestro resultado final para crear gráficos de torta y barras con JFreeChart nos quedará de la siguiente forma:

Una vez que saben como hacer uno de estos gráficos con JFreeChart, el resto (Líneas de Tiempo, Gráficos XY, etc.) son básicamente el mismo procedimiento con algunos detalles con respecto al dataset de cada tipo.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java