lunes, 28 de noviembre de 2011

Ordenar usando la interface Comparable

En este post revisaremos una duda que recibimos. El objetivo es leer un archivo que contiene en cada línea datos que representan una instancia. Por ejemplo el siguiente archivo (productos.txt) contiene:

555 Producto1 200 3
333 Producto2 300 1
222 Producto3 400 2
111 Producto4 150 5

Para representar un producto, creamos una clase Producto que contiene un id, nombre, precio y cantidad en inventario. Y deseamos ordenarlo por id del producto. El tip es que la clase Producto debe implementar la interface Comparable para que podamos comparar entre productos y de esta forma puedan ser ordenados.

El siguiente código muestra cómo ordenar el archivo anterior (copiar el código en un archivo con nombre OrdenarArchivo.java), los pasos son muy sencillos:

  1. leemos cada línea del archivo y la dividimos en los campos de un producto (se asume que los campos están separados por un espacio en blanco);
  2. creamos una instancia de Producto y la agregamos a una lista de Productos;
  3. ordenamos la lista usando Collections.sort

Es importante notar que tras bambalinas Collections.sort está usando el método compareTo (de la interface Comparable) que implementamos en la clase Producto. Al ejecutar el código debe imprimir:

Elementos originales:
[555 Producto1 200.0 3, 333 Producto2 300.0 1, 
222 Producto3 400.0 2, 111 Producto4 150.0 5]
Elementos ordenados:
[111 Producto4 150.0 5, 222 Producto3 400.0 2, 
333 Producto2 300.0 1, 555 Producto1 200.0 3]

OrdenarArchivo.java

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

public class OrdenarArchivo{
  public static void main(String [] args){
    String filename = "productos.txt";
    String linea = null;
    String[] datos = null;
    List<Producto> productos = new ArrayList<Producto>();
    Producto producto = null;
    try{
      BufferedReader br = new BufferedReader(
                           new FileReader(filename)); 
      // leer todas la lineas del archivo
      while((linea=br.readLine())!=null){
        // cada linea tiene los datos para crear un producto
        datos = linea.split(" ");
        producto = new Producto(
                    Integer.parseInt(datos[0]),
                    datos[1],
                    Double.parseDouble(datos[2]),
                    Integer.parseInt(datos[3]));
        // agregamos el producto a la lista de productos
        productos.add(producto);
      }
      br.close();
      // imprimir archivo en orden original
      System.out.println("Elementos originales:");
      System.out.println(productos);
      Collections.sort(productos);
      // imprimir archivo ordenado
      System.out.println("Elementos ordenados:");
      System.out.println(productos);
    }catch(IOException e){
      System.out.println(e);   
    }
  }
}

// Clase que representa lo que queremos ordenar
// Notar que estamos implementado Comparable
class Producto implements Comparable<Producto> {
  int id;
  String nombre;
  double precio;
  int inventario;
  
  public Producto(int id, String nombre, 
                  double precio, int inventario){
    this.id = id;
    this.nombre = nombre;
    this.precio = precio;
    this.inventario = inventario;
  }
  
  public String toString(){
    return id + " " + nombre + " " + 
           precio + " " + inventario;
  }
  
  // Este metodo es el que nos permite comparar
  // entre productos y de esta forma puedan ser ordenados.
  public int compareTo(Producto p){
    return id - p.id;
  }
}

sábado, 26 de noviembre de 2011

Modificadores en Java

A continuación podrán encontrar una tabla que resume en dónde es válido usar varios modificadores en Java. Por ejemplo una clase normal (es decir no anidada en otra clase o método) sólo tiene dos modificadores de acceso válidos: public y default; una clase anidada en otra clase (ya sea estática o no estática) puede usar private, default, protected, public; y una clase definida dentro de un método no puede usar modificadores de acceso.

Modificadores en Java.

Si encuentran algún error, por favor repórtenlo en los comentarios.

lunes, 14 de noviembre de 2011

CyArk: preservación digital de nuestro pasado

CyArk (Cyber Archive o Ciber Archivo) es una organización sin fines de lucro cuyo objetivo es la preservación digital de sitios considerados como patrimonio histórico y cultural de la humanidad.

La preservación de estos lugares se lleva a cabo mediante recursos de alta tecnología entre los cuales se encuentra el uso del escaneo a través de láser en 3D, lo que produce una serie de puntos que son transformados a una imagen tridimensional del área escaneada y cuya precisión se encuentra entre los 2 y 3 mm. El escaneo se lleva a cabo en cuestión de minutos y los datos que son colectados se utilizan para producir representaciones espectacularmente precisas de los sitios escaneados.

Actualmente, CyArk está llevando a cabo proyectos de preservación en varios lugares alrededor del mundo y México no es la excepción. En nuestro país, se han llevado a cabo proyectos sumamente interesantes en las ciudades mayas de Chichén Itzá, Tikal, la capital zapoteca Monte Albán, así como un proyecto en progreso para preservar Teotihuacán, la Ciudad de los Dioses.

CyArk es un proyecto que merece la pena dar a conocer y más aún cuando se cuenta con hermosos sitios dignos de preservación para conocimiento y goce de las futuras generaciones. En México somos afortunados porque existe una gran variedad de estos lugares y vale la pena saber que se están realizando esfuerzos para preservarlos.

Visiten el sitio de CyArk, entérense de la maravillosa obra de esta organización y de alguna manera, comencemos a involucrarnos.

CyArk lanza página web en español

Página principal de CyArk

Sitios de Patrimonio: Monte Albán

Información para contribuir con el proyecto de CyArk

Preservación digital de Chichén Itzá

jueves, 10 de noviembre de 2011

Recursos Java Recomendados

Durante los últimos meses me estuve preparando para la certificación de Programador Java (Oracle Certified Professional Java Programmer). Sin lugar a dudas el libro recomendado es SCJP Sun Certified Programmer for Java 6 por Katherine Sierra y Bert Bates. Sin embargo, algunos tópicos requirieron materiales extra. Aún cuando existe una cantidad abrumadora de recursos y tutoriales acerca de Java, me gustaría compartir cuatro de los sitios que fueron de gran ayuda durante mi preparación.

1) Especificación de la API de Java

Fue de gran ayuda para estudiar métodos y parámetros, por ejemplo de las clases “Wrapper” (Integer, Double, Long, …). Además siempre que estemos desarrollando en Java debemos tener a la mano esta API.

2) Jdocs

El propósito de este sitio es presentar una versión aumentada de la tradicional API de Java. Lo que realmente me ayudó es que también permite visualizar el código fuente. Con ello entendí más detalles acerca del comportamiento de varias clases, en una ocasión lo usé para ver cómo estaban implementados los métodos equals, compareTo y hashCode de la clase Integer.

3) Vídeo Tutoriales por Clive Scott

Si son más del tipo de aprender a través de vídeo tutoriales, este sitio les fascinará. En youtube hay muchos tutoriales Java que generalmente cubren aspectos básicos o introductorios. Esta página presenta un compendio de vídeos que cubren a profundidad temas como overriding, overloading, clases anidadas, modificadores de acceso, entre otros. Si acabas de tomar alguna clase básica o intermedia de Java, estos tutoriales son de gran ayuda para repasar y profundizar varios temas. Altamente recomendable.

4) Tutoriales en mindprod.com

Este sitio contiene tutoriales que cubren tópicos con gran detalle. Por ejemplo, el tutorial acerca de la operación módulo menciona qué pasa si uno de los operandos es negativo (-10%4, 10%-4, -10%-4), presenta un par de tablas para poder comparar el módulo en java vs. el módulo de acuerdo a su definición matemática y menciona ejemplos de la utilidad de este operador. El tutorial de clases anidadas, además de conceptos básicos, tiene una tabla para mostrar los modificadores de acceso válidos para los diferentes tipos de clases y otra para mostrar las combinaciones de qué tipo de clases pueden heredar qué tipo de clases, por ejemplo una clase definida en un método sólo puede ser extendida por otra clase definida en el mismo método o una clase anónima en el mismo método. En general, un gran nivel de detalle con varios ejemplos.

5) Extra

Estos son algunos posts o tutoriales extras que también les recomiendo:

Por último, si alguien está interesado en certificarse les recomiendo los exámenes del sitio Whizlabs. Ofrece un examen de muestra. Y si deciden comprar el paquete de exámenes de práctica, les serán de gran utilidad ya que el nivel de dificultad es similar al examen de certificación. De hecho originalmente el examen tenía una duración de 3 horas, pero unos quince días antes de presentar mi examen, el tiempo límite cambió a 2.5 horas. Afortunadamente, gracias a los exámenes de práctica completé el examen de certificación en tiempo con 95% (57 de 60).

Espero que los recursos recomendados les sirvan y ayuden.