Ordenar cualquier array con SORT en JAVA
En entradas anteriores ya aprendimos a ordenar un array numérico con la ordenación de burbuja (Bubble sort). En este caso facilitaremos mucho las cosas ya que en la API estándar de JAVA podemos encontrar el método sort de la clase Arrays, que está en el paquete java.util que se encargará de ordenar cualquier tipo de array que le pasemos como argumento.
Su uso se verá mejor con el siguiente ejemplo:
Su uso se verá mejor con el siguiente ejemplo:
import java.util.Arrays; public class Main { public static void main(String[] args) { //Array de String String[] nombres = {"Pepe", "Juan", "Alex", "Julian", "Francisco", "Luis"}; //Ordena el array Arrays.sort(nombres); //Mostramos el array ya ordenado for (String i : nombres) { System.out.print(i + ", "); } } }A este método se le puede pasar cualquier array de cualquier tipo, ya probamos un tipo referencia con el tipo String, así que a continuación podrás ver el método sort en acción con un array de tipo primitivo int.
import java.util.Arrays; public class Main { public static void main(String[] args) { //Array de String int[] nombres = {4, 2, 6, -3, 10, 11, 166, 1}; //Ordena el array Arrays.sort(nombres); //Mostramos el array ya ordenado for (int i : nombres) { System.out.print(i + ", "); } } }
Se entiende perfecto :D
ResponderEliminarbien hecho =D
ResponderEliminary como se especifica que sea de mayor a menor o de menor a mayor??
ResponderEliminarSe podría hacer con un segundo parametro al método sort que modifica el orden natural de ordenado.
EliminarCollections.reverseOrder()
De modo que al metodo sort le pasas como primer parametro el array a ordenar, y como segundo parametro la llamada al metodo descrita anteriormente.
Saludos.
Y para ordenar un arreglo definido por ejemplo 100
ResponderEliminarSe haría exactamente igual.
Eliminarmuchas gracias amigo :D pero tengo una duda ¿como le hago de mayor a menor ?¿me podrias dar un codigo ? saludos.
ResponderEliminarEso esta explicado en una de mis respuestas anteriores en este mismo post.
EliminarSaludos.
Con esto sale por la consola el primer valor, como se hace para que salgan el resto de valores?
ResponderEliminarcon un for sale en los ejemplos que ha puesto arriba
EliminarEs posible ordenar un array de objetos de una clase (definidos con un atributo fecha de tipo Calendar) mediante algun metodo ya programado de las apis de Java? Agradeceria mucho su ayuda
ResponderEliminarSe podría hacer también con el método sort, para ello tu clase que contiene el objeto de tipo Calendar debe de implementar la interfaz Comparable, e implementar su método compareTo, en la que debes definir su comportamiento, en este caso lo normal es devolver 0 si son iguales, -1 si es menor y 1 si es mayor (o en este caso -1 antes y 1 después).
EliminarAquí te copio un ejemplo de como se haría esto:
import java.util.Calendar;
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
Calendar c1 = Calendar.getInstance();
c1.set(Calendar.MONTH, Calendar.DECEMBER);
Calendar c2 = Calendar.getInstance();
c2.set(Calendar.MONTH, Calendar.MAY);
Calendar c3 = Calendar.getInstance();
c3.set(Calendar.MONTH, Calendar.APRIL);
Prueba p1 = new Prueba(c1);
Prueba p2 = new Prueba(c2);
Prueba p3 = new Prueba(c3);
Prueba[] array = new Prueba[] {p1, p3, p2};
// Ordenado de menor a mayor
Arrays.sort(array);
show(array);
// Ordenado de mayor a menor
Arrays.sort(array, Collections.reverseOrder());
show(array);
}
public static void show(Prueba[] p) {
for(Prueba i: p) {
System.out.print(i + ", ");
}
System.out.println();
}
static public class Prueba implements Comparable {
public Calendar cal;
public Prueba(Calendar cal){
this.cal = cal;
}
@Override
public int compareTo(Prueba obj) {
if(cal.getTimeInMillis() < obj.cal.getTimeInMillis()) {
return -1;
} else if(cal.getTimeInMillis() > obj.cal.getTimeInMillis()) {
return 1;
}
return 0;
}
@Override
public String toString() {
return cal.getTime().toString();
}
}
}
Saludos.
Hola,
ResponderEliminarcomo se podría hacer para utilizar Sort en arrays múltiples.
Por ejemplo, si tengo un array bidimensional String y quiero ordenar por la primera columna.
Gracias
Este comentario ha sido eliminado por el autor.
ResponderEliminarSe han borrado algunos comentarios sin querer, igualmente los responderé, este código funciona correctamente para mi.
ResponderEliminarpublic static void main(String[] args) {
int[] v = new int[100];
for(int i = 99; i >= 0; i--) {
v[100 - 1 - i] = i;
}
Arrays.sort(v);
for(int i = 0; i < 100; i++) {
System.out.print(v[i] + " ");
}
System.out.println();
}
Saludos.
tambien me interesa lo de ordenar array bidimensional String basandose en la columna 2.es decir.
ResponderEliminarcodigo:101, sexo;Hombre, edad;25, cp:8000, cuota;23,5.
dentro el array tengo varias filas y tengo que ordenalos por edad, de mas joven a mas mayor. seria ir comparando edades y subir la fila entera si procede. llevo 2 dias con eso...
Gracias, voy justo de tiempo tengo que entragar esta noche.
y que habría que hacer para utilizar el método sort para ordenar una clase definida por ti, como por ejemplo ordenar un array con figuras geométricas por su área (clase figura)
ResponderEliminarTu clase Figura debe implementar la interfaz "Comparable" e implementar el método "public int compareTo(Figura otraFigura)".
EliminarLa implementación del método deberá devolver 1 si el área de la figura actual es mayor, -1 si es menor ó 0 si es igual al área de otraFigura.
Una vez hecho esto, puedes hacer un array de figuras y pasarlo como parámetro a la función Arrays.sort().
Ejemplo de la clase Figura:
public static class Figura implements Comparable {
private double area;
public Figura(double area) {
this.area = area;
}
@Override
public int compareTo(Figura figura) {
if (this.area > figura.area) {
return 1;
} else if (this.area < figura.area) {
return -1;
}
return 0;
}
}
Uso de la clase figura:
Figura f1 = new Figura(2.4);
Figura f2= new Figura(2.7);
Figura f3 = new Figura(2.6);
Figura[] figuras = new Figura[]{f1, f2, f3};
// Orden 2.4, 2.7, 2.6
Arrays.sort(figuras);
// Orden 2.4, 2.6, 2.7
usando este ejemplo podrian imprimir los 2 arreglos de forma ordenada.
ResponderEliminarPD: ojo en el ejemplo esta de forma separada.
gracias.
se podria usar para un array de objetos con mas de un atributo?
ResponderEliminarcomo le hiciste para aprender java tan bien?
ResponderEliminarquiero ordenar esta lista, por edad o por nombre desde un menu de opciones, que tendria que cambiar o que tendria que hacer para que lo haga de culaquiera de las dos?
ResponderEliminarpackage javaapplication1;
class Persona implements Comparable {
public Integer edad;
public String nombre;
public Integer getEdad() {
return edad;
}
public void setEdad(Integer edad) {
this.edad = edad;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
@Override
public String toString() {
return "Persona{" + "edad=" + edad + ", nombre=" + nombre + '}';
}
@Override
public int compareTo(Persona o) {
return nombre.compareTo(o.getNombre());
}
}
package javaapplication1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class JavaApplication1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
ArrayListlista=new ArrayList<>();
for(int x=0;x<=4;x++){
System.out.println("Dame nombre y edad");
Persona p=new Persona();
p.setNombre(sc.nextLine());
p.setEdad(Integer.parseInt(sc.nextLine()));
lista.add(p);
}
Collections.sort(lista);
for(Persona q:lista){System.out.println(q.toString());}
}
}
Hola que tal me gustaria saber porque al cambiar el tipo de variable al ejemplo de 2 (El ejercicio de ordenar los números) cambia el orden de estos. Quiero decir que si uno transforma el array de int en array de String pero con los mismos elementos el ordenamiento resulta diferente.
ResponderEliminarMe gustaria una explicación del porque sucede eso
Esto es por que el orden lexicográfico usado en la funcion "sort" de strings no corresponde con el orden numérico. El string "11" resulta menor que "9", cosa que no ocurre cuando comparas números.
EliminarHay algún método para evitar que suceda el orden lexicográfico con un array de string compuesto con numero. Seria de gran ayuda para un programa que estoy haciendo.
EliminarPuedes configurar el comparador para que se haga con los valores numéricos:
EliminarArrays.sort(stringArray, new Comparator()
{
@Override
public int compare(String s1, String s2)
{
Integer val1 = Integer.parseInt(s1);
Integer val2 = Integer.parseInt(s2);
return val1.compareTo(val2);
}
});