crear un programa que lea 10 palabras y las guarde en un arreglo. Se debe
mostrar las palabras ingresadas, ordenarlas en orden alfabético y luego volver a mostrar.
Hola, primero decir que la clase
Arrays tiene un método llamado
sort() que ordena arrays.
Pero claro, aquí lo interesante es que lo hagamos nosotros y no que Java nos lo de ya hecho.
Para ordenar un array de String necesitamos dos cosas:
- un algoritmo de ordenación.
- saber cómo comparar Strings
Algoritmo de ordenación..., hay varios, el más famosete y el primero que se suele enseñar, es el "método de la burbuja".
Consiste en recorrer el array con dos bucles anidados un número determinado de veces y comparar cada elemento con el siguiente. Si el elemento siguiente es menor (si queremos ordenar de menor a mayor) al elemento actual, se intercambian sus posiciones y se continua con los elementos siguientes.
De este modo, los elementos menores van "subiendo" por la lista hasta ponerse los primeros. Por eso le llaman "burbuja", porque las burbujas suben...
Sí, los informáticos no son muy buenos con las metáforas...
Como digo, es el más famoso y sencillo, pero también
el menos eficiente. Porque como dije antes el proceso se repite un número
determinado de veces. Aunque el array ya esté correctamente ordenado, el proceso seguirá haciendo comparaciones innecesarias hasta que los ciclos de los bucles terminen.
Pero bueno, para un array de 10 elementos como es este caso, nos basta y nos sobra.
Ya tendríamos
método de ordenación Ahora, ¿cómo
comparamos Strings?
Para ordenar alfabéticamente habría que poner primero las que empiecen por a, luego b, luego c, etc....
Y de entre todas las que empiezan por a, primero irían las que su segunda letra también es a, luego las que la segunda letra es b, etc...
Y luego habría que ver la tercera letra, la cuarta, la quinta..., tener en cuenta que no todas las palabras tienen el mismo número de letras...
Sí, es complicado. Pero no temas, no vas a tener que desarrollar un algoritmo que haga todo eso (aunque si te hace ilusión, adelante...
).
Esta vez sí vamos a dejar que Java lo haga por nosotros.
TODAS las clases escritas en Java, y cuando digo TODAS, incluyo también a las que algún día escribirás tu también cuando te enseñen Programación Orientada a Objetos (POO), TODAS son y serán hijas de la clase
Object, que es algo así como la superclase suprema en Java.
Esto implica que todas las clases heredan ciertos métodos comúnes que todas van a tener.
Uno de estos métodos, es el llamado
compareTo(), que está destinado a que un objeto pueda compararse con otro, para determinar si son iguales o si uno es mayor que el otro o viceversa.
Este método es para que el programador le incluya un código acorde a sus clases.
Si un programador crea una clase llamada Persona, podrá alterar este método y decidir como han de compararse sus objetos Persona, si en función de la edad, o de su altura, o de su peso, o de las letras de su apellido... o de lo que el programador crea oportuno.
La clase
String ya tiene
este método escrito y listo para que lo usemos.
Tan solo hay que invocarlo y saber interpretar los resultados que da.
El
compareTo() retorna un valor int que nos indica cuál es mayor o menor.
Si este int tiene valor 0, es que los dos String son iguales.
Si el int es un valor negativo, es decir, es menor que 0, significa que el primer elemento es menor que el segundo.
Si fuera un valor mayor que 0, entonces el primer elemento es mayor.
Un pequeño ejemplo.
Aclarar que si una palabra es "menor" que la otra, significa que la primera palabra va delante de la otra si ordenamos alfabéticamente.
String palabra1 = "Hola";
String palabra2 = "Adios";
int comparar = palabra1.compareTo(palabra2);
if (comparar == 0)
System.out.println("Las dos palabras son iguales");
else if (comparar < 0)
System.out.println("Palabra1 es menor que Palabra2");
else
System.out.println("Palabra1 es mayor que Palabra2");
Bueno, pues ahora ya tenemos
método de ordenación, y también un
método de comparaciónY se puede completar el ejercicio.
Disculpa si me ando mucho por las ramas con tanta explicación. Pero creo importante no solo darte el código de la solución. Si no explicar por qué funciona, y cómo funciona, y de donde sale...
Porque muchos estudiantes conocen el compareTo(), pero no saben de donde sale y por qué.., y piensan que es un método mágico que les va a servir para comparar cualquier cosa. Y no es así.
Los String los compara porque alguien ya le ha escrito un código.
El resto de clases, si nosotros no le escribimos un código, no va a saber comparar nada...
En fin, aquí te pongo la solución.
Los bucles de ordenación parecen un poco liosos, pero si te fijas básicamente lo que hace es comparar los elementos que son contiguos y si el que está detrás es menor, intercambia la posición con el otro para que quede delante.
public class OrdenaPalabras {
public static void main(String[] args) {
String palabra;
Scanner leer=new Scanner(System.in);
String array[]=new String[10];
System.out.println("Introduzca 10 palabras:");
for(int i=0; i<=9; i++) {
palabra=leer.nextLine();
array[i]=palabra;
}
leer.close();
System.out.println("Las palabras ingresadas fueron: \n" + Arrays.toString(array));
//Ordenar array, usando método burbuja y compareTo()
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - 1; j++) {
if (array[j + 1].compareTo(array[j]) < 0) {
//Elemento que está detrás es menor, intercambiamos posiciones
String aux = array[j + 1];
array[j + 1] = array[j];
array[j] = aux;
}
}
}
System.out.println("Las palabras ordenadas son: \n" + Arrays.toString(array));
}
}