Cómo ordenar un array en Java

Ordenar un array en Java es una tarea fundamental que cada programador debe conocer. En este artículo, aprenderás cómo ordenar un array en Java mediante el uso de la función estándar Arrays.sort(). Veremos cómo ordenar arrays de números, cadenas y objetos, y exploraremos cómo hacerlo en orden ascendente y descendente. A lo largo de este artículo, te proporcionaremos ejemplos claros y funcionales para que puedas aplicar los conceptos directamente a tus proyectos.

¿Cómo ordenar un array en Java usando Arrays.sort()?

El método Arrays.sort() es la forma más sencilla y eficiente de ordenar un array en Java. Por defecto, este método ordena los elementos en orden ascendente, lo que lo hace ideal para la mayoría de las situaciones en las que se desea organizar los datos de menor a mayor.

A continuación, te mostramos un ejemplo de cómo crear un arreglo en Java y luego utilizar Arrays.sort() para ordenarlo:

import java.util.Arrays;

public class OrdenarArray {
    public static void main(String[] args) {
        int[] numeros = {5, 2, 8, 1, 4};
        Arrays.sort(numeros);

        System.out.println("Array ordenado: " + Arrays.toString(numeros));
    }
}

Salida:

Array ordenado: [1, 2, 4, 5, 8]

En este ejemplo, Arrays.sort(numeros) organiza el array numeros en orden ascendente, desde el valor más bajo hasta el más alto. Este método es muy útil cuando se trabaja con arrays de tipos primitivos como enteros, caracteres o doubles. Es rápido y no requiere implementación adicional.

Además, puedes usar Arrays.sort() en arrays de objetos, como cadenas de texto o incluso objetos personalizados que implementen la interfaz Comparable.

Ordenar un array de manera descendente en Java

Si necesitas ordenar un array en Java en orden descendente, puedes invertir el orden de los elementos utilizando un comparador personalizado. Aunque Arrays.sort() ordena los elementos en orden ascendente de manera predeterminada, con un comparador podemos modificar este comportamiento para lograr un orden descendente.

A continuación, te mostramos un ejemplo de cómo ordenar un array de números en orden descendente utilizando Arrays.sort() y un comparador:

import java.util.Arrays;
import java.util.Collections;

public class OrdenarDescendente {
    public static void main(String[] args) {
        Integer[] numeros = {5, 2, 8, 1, 4};
        
        // Ordenar en orden descendente usando un comparador
        Arrays.sort(numeros, Collections.reverseOrder());

        System.out.println("Array ordenado en orden descendente: " + Arrays.toString(numeros));
    }
}

Salida:

Array ordenado en orden descendente: [8, 5, 4, 2, 1]

En este ejemplo, utilizamos Collections.reverseOrder() como comparador, lo que invierte el orden predeterminado de los elementos y los ordena en forma descendente. Es importante notar que Arrays.sort() con un comparador personalizado solo funciona con arrays de objetos (en este caso, Integer[]), no con arrays de tipos primitivos como int[].

Este mismo enfoque también puede aplicarse a otras estructuras de datos en Java, como ArrayList, utilizando Collections.sort() con el comparador reverseOrder() para ordenar la lista de manera descendente.

Cómo ordenar un array de objetos en Java

Ordenar un array de objetos en Java puede ser más complejo que ordenar arrays de tipos primitivos, ya que los objetos no se pueden comparar directamente de la misma manera que los números o cadenas. Para ordenar un array de objetos, es necesario que los objetos implementen la interfaz Comparable o usar un Comparator externo para definir el criterio de ordenación.

Ordenar un array de objetos implementando Comparable

Una forma de ordenar un array de objetos es hacer que la clase de los objetos implemente la interfaz Comparable. Este enfoque permite que los objetos se comparen entre sí mediante el método compareTo(). A continuación, te mostramos un ejemplo de cómo hacerlo:

import java.util.Arrays;

class Persona implements Comparable<Persona> {
    String nombre;
    int edad;

    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    @Override
    public int compareTo(Persona otraPersona) {
        return Integer.compare(this.edad, otraPersona.edad); // Ordenar por edad
    }

    @Override
    public String toString() {
        return nombre + " (" + edad + ")";
    }
}

public class OrdenarObjetos {
    public static void main(String[] args) {
        Persona[] personas = {
            new Persona("Juan", 25),
            new Persona("Ana", 30),
            new Persona("Pedro", 20)
        };

        Arrays.sort(personas);  // Ordena por la edad gracias a compareTo()
        System.out.println("Array ordenado por edad: " + Arrays.toString(personas));
    }
}

Salida:

Array ordenado por edad: [Pedro (20), Juan (25), Ana (30)]

En este ejemplo, la clase Persona implementa Comparable<Persona> y sobrescribe el método compareTo(). Este método define que la ordenación se hará por la edad de las personas. Al llamar a Arrays.sort(), los objetos de tipo Persona se ordenan según este criterio.

Ordenar con un Comparator externo

Si no puedes modificar la clase para implementar Comparable, o si necesitas ordenar los objetos de diferentes maneras (por ejemplo, por nombre o por edad), puedes usar un Comparator externo. Aquí tienes un ejemplo de cómo hacerlo:

import java.util.Arrays;
import java.util.Comparator;

class Persona {
    String nombre;
    int edad;

    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    @Override
    public String toString() {
        return nombre + " (" + edad + ")";
    }
}

public class OrdenarConComparator {
    public static void main(String[] args) {
        Persona[] personas = {
            new Persona("Juan", 25),
            new Persona("Ana", 30),
            new Persona("Pedro", 20)
        };

        // Usar Comparator para ordenar por nombre
        Arrays.sort(personas, Comparator.comparing(persona -> persona.nombre));
        System.out.println("Array ordenado por nombre: " + Arrays.toString(personas));
    }
}

Salida:

Array ordenado por nombre: [Ana (30), Juan (25), Pedro (20)]

En este caso, utilizamos un Comparator para ordenar los objetos por nombre, sin necesidad de que la clase Persona implemente Comparable.

De esta forma, puedes ordenar arrays de objetos en Java tanto implementando Comparable como usando un Comparator externo, dependiendo de tus necesidades.

Ordenar un array bidimensional o una matriz en Java

Las matrices o arrays bidimensionales son estructuras comunes en Java, especialmente cuando se trabaja con datos organizados en filas y columnas. Al igual que con los arrays unidimensionales, en algunos casos es necesario ordenar los elementos de una matriz. En Java, puedes ordenar una matriz de diferentes maneras: ya sea ordenando cada fila individualmente o reorganizando los elementos según un criterio específico.

Ordenar cada fila de la matriz individualmente

Una opción común es ordenar cada fila de la matriz por separado. Para hacerlo, puedes usar Arrays.sort() para ordenar las filas, que son arrays unidimensionales dentro de la matriz.

Aquí te mostramos cómo ordenar cada fila de un array bidimensional:

import java.util.Arrays;

public class OrdenarMatriz {
    public static void main(String[] args) {
        int[][] matriz = {
            {5, 2, 8},
            {1, 4, 3},
            {7, 6, 9}
        };

        // Ordenar cada fila individualmente
        for (int i = 0; i < matriz.length; i++) {
            Arrays.sort(matriz[i]);
        }

        // Imprimir la matriz ordenada por filas
        System.out.println("Matriz ordenada por filas:");
        for (int[] fila : matriz) {
            System.out.println(Arrays.toString(fila));
        }
    }
}

Salida:

Matriz ordenada por filas:
[2, 5, 8]
[1, 3, 4]
[6, 7, 9]

En este ejemplo, cada fila de la matriz es ordenada de manera independiente utilizando Arrays.sort(). Este enfoque es útil cuando se necesita ordenar los elementos de cada fila sin preocuparse por la relación entre las filas.

Ordenar la matriz completa según un criterio

Si deseas reorganizar toda la matriz basándote en un criterio específico, como ordenar los elementos de la matriz de menor a mayor en su totalidad, puedes usar un enfoque diferente. Una opción es convertir la matriz en un array unidimensional, ordenarlo y luego convertirlo de nuevo en una matriz bidimensional.

Aquí te mostramos cómo ordenar toda la matriz de menor a mayor:

import java.util.Arrays;

public class OrdenarMatrizCompleta {
    public static void main(String[] args) {
        int[][] matriz = {
            {5, 2, 8},
            {1, 4, 3},
            {7, 6, 9}
        };

        // Convertir la matriz en un array unidimensional
        int[] array = Arrays.stream(matriz)
                             .flatMapToInt(Arrays::stream)
                             .toArray();

        // Ordenar el array unidimensional
        Arrays.sort(array);

        // Volver a convertir el array ordenado en una matriz
        int[][] matrizOrdenada = new int[matriz.length][matriz[0].length];
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                matrizOrdenada[i][j] = array[i * matriz[0].length + j];
            }
        }

        // Imprimir la matriz ordenada
        System.out.println("Matriz ordenada completa:");
        for (int[] fila : matrizOrdenada) {
            System.out.println(Arrays.toString(fila));
        }
    }
}

Salida:

Matriz ordenada completa:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

En este ejemplo, primero convertimos la matriz bidimensional en un array unidimensional usando flatMapToInt(), luego la ordenamos con Arrays.sort() y finalmente reconstruimos la matriz bidimensional con los elementos ordenados.

De esta forma, puedes ordenar una matriz en Java, ya sea ordenando cada fila de manera independiente o reorganizando los elementos de toda la matriz según un criterio específico.

Conclusión

En este artículo, hemos cubierto diversas formas de ordenar un array en Java. Comenzamos con el método más sencillo y eficiente, Arrays.sort(), que permite ordenar arrays de tipos primitivos y objetos de manera ascendente. También exploramos cómo ordenar un array en orden descendente utilizando un comparador personalizado, y cómo trabajar con arrays de objetos implementando la interfaz Comparable o utilizando un Comparator externo. Además, discutimos cómo ordenar matrices bidimensionales, ya sea por filas o reorganizando toda la matriz según un criterio.

La elección del método adecuado depende del tipo de datos con los que estés trabajando y de la flexibilidad que necesites. Si solo necesitas ordenar en orden ascendente y estás trabajando con tipos primitivos o colecciones simples, Arrays.sort() es la mejor opción. Si necesitas un control más avanzado sobre el orden, como ordenar en orden descendente o personalizar el criterio de ordenación, un comparador o la implementación de Comparable serán más adecuados.

Independientemente del enfoque que elijas, saber cómo ordenar un array en Java es una habilidad clave para optimizar tus algoritmos y mejorar la eficiencia de tus aplicaciones.