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:
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 + ", ");
        }
    }
}

Comentarios

  1. Se entiende perfecto :D

    ResponderEliminar
  2. y como se especifica que sea de mayor a menor o de menor a mayor??

    ResponderEliminar
    Respuestas
    1. Se podría hacer con un segundo parametro al método sort que modifica el orden natural de ordenado.

      Collections.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.

      Eliminar
  3. Y para ordenar un arreglo definido por ejemplo 100

    ResponderEliminar
  4. muchas gracias amigo :D pero tengo una duda ¿como le hago de mayor a menor ?¿me podrias dar un codigo ? saludos.

    ResponderEliminar
    Respuestas
    1. Eso esta explicado en una de mis respuestas anteriores en este mismo post.

      Saludos.

      Eliminar
  5. Con esto sale por la consola el primer valor, como se hace para que salgan el resto de valores?

    ResponderEliminar
    Respuestas
    1. con un for sale en los ejemplos que ha puesto arriba

      Eliminar
  6. Es 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

    ResponderEliminar
    Respuestas
    1. Se 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).

      Aquí 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.

      Eliminar
  7. Hola,

    como 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

    ResponderEliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. Se han borrado algunos comentarios sin querer, igualmente los responderé, este código funciona correctamente para mi.

    public 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.

    ResponderEliminar
  10. tambien me interesa lo de ordenar array bidimensional String basandose en la columna 2.es decir.
    codigo: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.

    ResponderEliminar
  11. 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)

    ResponderEliminar
    Respuestas
    1. Tu clase Figura debe implementar la interfaz "Comparable" e implementar el método "public int compareTo(Figura otraFigura)".

      La 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

      Eliminar
  12. usando este ejemplo podrian imprimir los 2 arreglos de forma ordenada.
    PD: ojo en el ejemplo esta de forma separada.
    gracias.

    ResponderEliminar
  13. se podria usar para un array de objetos con mas de un atributo?

    ResponderEliminar
  14. como le hiciste para aprender java tan bien?

    ResponderEliminar
  15. quiero 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?

    package 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());}
    }

    }

    ResponderEliminar
  16. 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.
    Me gustaria una explicación del porque sucede eso

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
    2. Hay 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.

      Eliminar
    3. Puedes configurar el comparador para que se haga con los valores numéricos:

      Arrays.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);
      }
      });

      Eliminar

Publicar un comentario

Si tenéis alguna duda o sugerencia, no dudéis en comentar. ;)

Entradas populares de este blog

Autocompletado de codigo en Sublime Text

Compilar y ejecutar JAVA desde Sublime Text

Compilar y ejecutar JAVA desde Notepad++