Ejemplos con arrays, dividir en métodos y comentar

Los siguientes ejemplos ya empiezan a parecerse al código que podemos encontrar en aplicaciones profesionales. Vale resaltar el uso de comentarios y la división del código en métodos.

Comentarios en el código

Los comentarios en el código son obligatorios en cualquier proyecto serio. Como mínimo, antes de la cabecera de las clases, interfaces y métodos.

En Eclipse, podemos generar comentarios de este tipo colocando el cursor delante de la cabecera y oprimiendo <alt><shift><j>.

Existen herramientas que generan la documentación automáticamente a partir de estos comentarios.

También es recomendable comentar entre líneas de código. Elegir nombres de variables y métodos descriptivos, también pueden reemplazar el uso de comentarios.

División del código en métodos

La división del programa en procedimientos o métodos es una técnica obligada. Es importante que cada método logre encapsular una tarea específica y si es posible ocultar complejidad a los usuarios de ese método.

Esto facilita enormemente la programación y aumenta la calidad.

Nombres de identificadores en inglés

Cuando programamos es conveniente que el código fuente esté escrito en inglés. Muchos caracteres en español son conflictivos para las herramientas de desarrollo. También es probable que nuestro código sea leído por personas que no hablen nuestro idioma y aunque no nos guste, el lenguaje común en informática, es el inglés.

También recomiendo en general que los comentarios estén en ingles, aunque hay excepciones, si el público receptor no habla inglés esto puede ser una mala idea. Este es el caso de nuestros tutoriales en español, ya que tenemos tambien una version en ingles.

Ejemplo simple con arrays, promedio, máximo y mínimo

El siguiente programa sortea diez números al azar del 0 al 99, los imprime y calcula el promedio, el máximo y el mínimo.

package com.edu4java.javatutorials;

import java.util.Random;

/**
 * @author edu4java
 * 
 *         Ejemplo de uso de sentencia for para la manipulación de arrays
 */
public class ForArray {
	public static void main(String[] args) {

		int[] numbers = generateNumbers();
		// imprime los números sorteados
		print2Console("Números sorteados: ", numbers);
		// imprime el promedio
		System.out.println("Promedio:" + average(numbers));
		// imprime el máximo
		System.out.println("Máximo:" + max(numbers));
		// imprime el mínimo
		System.out.println("Mínimo:" + min(numbers));
	}

	/**
	 * Genera aleatoriamente diez números
	 * 
	 * @return Los números generados
	 */
	private static int[] generateNumbers() {
		Random random = new Random();
		int[] numbers = new int[10];
		// sortea 10 números del 0 al 99
		for (int i = 0; i < numbers.length; i++) {
			numbers[i] = random.nextInt(100);
		}
		return numbers;
	}

	/**
	 * Imprime por la consola el texto message seguido de los números del array
	 * numbers separados por espacios
	 * 
	 * @param message
	 *            El mensaje a ser mostrado
	 * @param numbers
	 *            Los números a ser impresos
	 */
	private static void print2Console(String message, int[] numbers) {
		System.out.print(message);
		for (int number : numbers) {
			System.out.print(number + " ");
		}
		System.out.println();
	}

	/**
	 * retorna el máximo de los números
	 * 
	 * @param numbers
	 *            Los números donde buscar el máximo
	 * @return El número máximo
	 */
	private static int max(int[] numbers) {
		int max = 0;
		for (int number : numbers) {
			if (max < number) {
				max = number;
			}
		}
		return max;
	}

	/**
	 * retorna el mínimo de los números
	 * 
	 * @param numbers
	 *            Los números dónde buscar el mínimo
	 * @return El número mínimo
	 */
	private static int min(int[] numbers) {
		int min = Integer.MAX_VALUE;
		for (int number : numbers) {
			if (min > number) {
				min = number;
			}
		}
		return min;
	}

	/**
	 * calcula el promedio de los números
	 * 
	 * @param numbers
	 *            Los números a promediar
	 * @return El promedio
	 */
	private static int average(int[] numbers) {
		int accumulator = 0;
		for (int number : numbers) {
			accumulator = accumulator + number;
		}
		int average = accumulator / 10;
		return average;
	}
}

En el ejemplo vemos como generateNumbers() logró ocultar al resto del programa como se sortean los números, incluso oculta el uso del objeto Random. Desde el método main, se ve como generateNumbers() mágicamente retorna un array con los números ya sorteados.

De la misma forma, hemos creado métodos para imprimir por consola y calcular el promedio, máximo y mínimo.

Ejemplo complejo con arrays: ordenar

En este ejemplo, usaremos dos sentencias for anidadas para ordenar una lista de números sorteados. Primero, se imprime por la consola la lista sorteada y luego la misma lista pero ordenada de menor a mayor.

package com.edu4java.javatutorials;

import java.util.Random;

/**
 * @author edu4java
 * 
 *         En este ejemplo, usaremos dos sentencias for anidadas para ordenar
 *         una lista de números sorteados. Primero, se imprime por la consola la
 *         lista sorteada y luego la misma lista pero ordenada de menor a mayor.
 * 
 */
 public class ForArray2 {
 
		/**
		 * @param args no usados
		 */
		public static void main(String[] args) {
			int[] numbers = generateNumbers();
			print2Console("Números sorteados: ", numbers);
			numbers = sort(numbers);
			print2Console("Números ordenados: ", numbers);
		}

		/**
		 * Ordena un array de números de menor a mayor
		 * 
		 * @param numbers Los números a ordenar
		 * @return Los números ordenados
		 */
		private static int[] sort(int[] numbers) {
			for (int i = 0; i < numbers.length - 1; i++) {
				for (int j = i + 1; j < numbers.length; j++) {
					if (numbers[i] > numbers[j]) {
						int auxiliary = numbers[i];
						numbers[i] = numbers[j];
						numbers[j] = auxiliary;
					}
				}
			}
			return numbers;
		}

		/**
		 * Genera aleatoriamente diez números
		 * 
		 * @return Un array de diez enteros
		 */
		private static int[] generateNumbers() {
			Random random = new Random();
			int[] numbers = new int[10];
			// raffles 10 numbers from 0 to 99
			for (int i = 0; i < numbers.length; i++) {
				numbers[i] = random.nextInt(100);
			}
			return numbers;
		}

		/**
		 * Imprime por la consola el texto message seguido de los números del array
		 * numbers separados por espacios
		 * 
		 * @param message El mensaje a ser mostrado
		 * @param numbers Los números a ser impresos
		 */
		private static void print2Console(String message, int[] numbers) {
			System.out.print(message);
			for (int number : numbers) {
				System.out.print(number + " ");
			}
			System.out.println();
		}
	}




El método print4console aquí no sólo divide el programa sino que evita repetir el código. Reutilizamos el código cuando imprimimos la lista desordenada y despues ordenada.

Ahora veamos detenidamente el código usado para ordenar el array.

Algoritmo de ordenamiento utilizado

La idea para ordenar es, tomar el primer número y compararlo con cada uno de los números siguientes para ver si hay alguno menor. Cada vez que encuentro uno menor los intercambio. Al final del proceso puede estar seguro de que el número en la posición 1 es el menor del array, por tanto está ordenado.

Para ordenar el segundo número, repito el proceso de comparación con los que le siguen. Cuando termino con el anteúltimo puedo estar seguro de que la lista esta ordenada.

		for (int i = 0; i < numbers.length - 1; i++) {
			for (int j = i + 1; j < numbers.length; j++) {
				if (numbers[i] > numbers[j]) {
					int auxiliary = numbers[i];
					numbers[i] = numbers[j];
					numbers[j] = auxiliary;
				}
			}
		}

El primer for con índice i, va desde 0 a 8, que es la anteúltima posición del array. El segundo for tiene índice j. Para cada repetición de i, el índice j irá desde el valor i+1 hasta 9 la última posición del array.

Para cada repetición de j, nos fijamos si el valor en la posición i es mayor al de la j. Si es mayor, lo intercambiamos asegurándonos que al final nos queda el menor valor en la posición i.

Intercambiar los valores de dos variables

Cuando queremos intercambiar el contenido de dos variables se usa una tercera variable. Ej: intercambio a y b. c=a; a=b y b=c.

Esto es lo que hacemos en

	int auxiliary = numbers[i];
	numbers[i] = numbers[j];
	numbers[j] = auxiliary;