Tutorial 9 Java: Vectores. Parte III
¡Bienvenidos a un nuevo tutorial de Java en Geeky Theory! Hoy, por fin acabaremos con los tutoriales de vectores. Les he dedicado tres artículos porque son realmente importantes en muchos programas y, creo que es necesario saber cómo tratarlos.
En este artículo, vamos a aprender a ordenar vectores de forma paralela. ¿Qué quiere decir esto? Ordenar dos vectores con datos relacionados. En este caso, tendremos un vector con nombres y otro con edades. Ordenaremos el vector de las edades de menor a mayor y luego mostraremos por pantalla el nombre y las edades ordenadas.
Como el código va a ser completamente reciclado de los dos tutoriales anteriores, no lo explico desde el principio. Os lo dejo aquí:
package vectores; import java.util.Scanner; /** * * @author Mario * Tutorial 6 Java: Vectores * */ public class Vectores { private Scanner reader; private String[] nombre; private int[] edad; private int numero; public void introducir_numero_datos(){ reader=new Scanner(System.in); System.out.print("Introduzca el número de nombres: "); numero=reader.nextInt(); System.out.println(""); } public void cargar_nombres() { reader=new Scanner(System.in); nombre=new String[numero]; for(int i=0; i<numero; i++){ System.out.print("Introduzca el nombre "+(i+1)+": "); nombre[i]=reader.next(); } System.out.println(""); } public void cargar_edades(){ reader=new Scanner(System.in); edad=new int[numero]; for(int i=0; i<numero; i++){ System.out.print("Introduzca la edad de "+nombre[i]+": "); edad[i]=reader.nextInt(); } System.out.println(""); } public void mostrar_datos(){ System.out.println("DATOS INTRODUCIDOS:"); for(int i=0; i<numero; i++){ System.out.println(nombre[i]+": "+edad[i]+" años."); } } public static void main(String[] args) { Vectores datos=new Vectores(); datos.introducir_numero_datos(); datos.cargar_nombres(); datos.cargar_edades(); datos.mostrar_datos(); } }
Voy a cambiar el método de mostrar_datos() a ordenar_datos() y, lo primero que haré, es crear dos variables, una para enteros y otra de String, para tener un valor auxiliar al ordenar los datos de menor a mayor. Si lo hiciésemos de mayor a menor también sería necesario tenerla. Estas variables las declararemos junto con las que ya estaban en nuestro programa y, son las siguientes:
private String nombre_auxiliar; private int edad_auxiliar;
¿Cuál es el uso que le daré a estas variables?
Cuando encuentre una edad que sea menor que otra, lo que haré es intercambiar sus posiciones dentro del vector. Si a una le asigno otra, si haber guardado previamente el valor de la variable destino en una variable auxiliar, se perderá, ya que la estaremos sobrescribiendo. Si, por ejemplo, encontramos que el elemento 2 del vector, es menor que el elemento uno, no podemos pasar el elemento 2 al 1 sin más, ya que lo perderíamos, como ya he dicho anteriormente. Lo que tendríamos que hacer es una especie de triangulación de variable. El ítem 1 del vector lo pasaremos a una variable auxiliar. El ítem 2 lo pasaremos a la posición 1 y, no se perderá lo que había en la posición 1 porque lo tenemos guardado en la variable auxiliar. Tras esto, pasaremos el valor de la variable auxiliar a la posición dos del vector, habiendo intercambiado, así, las posiciones de ambas variables. Esto lo haremos con dos bucles for y un condicional, que os los dejo a continuación, junto con el método ordenar_datos() completo:
public void ordenar_datos(){ System.out.println("DATOS INTRODUCIDOS DE MENOR A MAYOR EDAD:"); for(int k=0; k for(int i=0; i if(edad[i+1]<edad[i]){ edad_auxiliar=edad[i]; edad[i]=edad[i+1]; edad[i+1]=edad_auxiliar; nombre_auxiliar=nombre[i]; nombre[i]=nombre[i+1]; nombre[i+1]=nombre_auxiliar; } } } //Desde este método imprimo ya los valores for(int i=0; i System.out.println(nombre[i]+": "+edad[i]+" años."); } }
Como podéis ver, se ha hecho la ordenación de los nombres de manera simultánea a la de las edades, para que no se crucen nombres y edades que no se corresponden.
Finalmente, en el main, utilizaremos el método como:
datos.ordenar_datos(); Cuando ejecutemos el programa, se nos pedirá el número de datos a introducir y se ordenarán, como vemos aquí:
El código completo:
package vectores; import java.util.Scanner; /** * * @author Mario * Tutorial 8 Java: Vectores * */ public class Vectores { private Scanner reader; private String[] nombre; private String nombre_auxiliar; private int[] edad; private int numero, edad_auxiliar; public void introducir_numero_datos(){ reader=new Scanner(System.in); System.out.print("Introduzca el número de nombres: "); numero=reader.nextInt(); System.out.println(""); } public void cargar_nombres() { reader=new Scanner(System.in); nombre=new String[numero]; for(int i=0; i System.out.print("Introduzca el nombre "+(i+1)+": "); nombre[i]=reader.next(); } System.out.println(""); } public void cargar_edades(){ reader=new Scanner(System.in); edad=new int[numero]; for(int i=0; i System.out.print("Introduzca la edad de "+nombre[i]+": "); edad[i]=reader.nextInt(); } System.out.println(""); } public void ordenar_datos(){ System.out.println("DATOS INTRODUCIDOS DE MENOR A MAYOR EDAD:"); for(int k=0; k for(int i=0; i if(edad[i+1]<edad[i]){ edad_auxiliar=edad[i]; edad[i]=edad[i+1]; edad[i+1]=edad_auxiliar; nombre_auxiliar=nombre[i]; nombre[i]=nombre[i+1]; nombre[i+1]=nombre_auxiliar; } } } //Desde este método imprimo ya los valores for(int i=0; i System.out.println(nombre[i]+": "+edad[i]+" años."); } } public static void main(String[] args) { Vectores datos=new Vectores(); datos.introducir_numero_datos(); datos.cargar_nombres(); datos.cargar_edades(); datos.ordenar_datos(); } } Por hoy está bien. Intentad asimilar lo que he hecho en el método ordenar_datos() y, si no entendéis algo, ya sabéis, dejad un comentario. ¡Nos vemos en el próximo tutorial!