¿Cómo ordenar un map cuya clave es una clase y su valor un ArrayList de clases?

publicado por: Anonymous

Si tengo declarado este map:

private Map<Asignatura, List<Alumno>> map = new HashMap<>();
public class Asignatura {
    private String nombre;
    private int codigo;
    private String profesor;
    private String departamento;
}
public class Alumno {
    private String apellido;
    private String nombre;
    private String correo;
    private String dni;
}

y quisiera por ejemplo dada una asignatura (por su código), mostrar la relación de alumnos de esa asignatura (puede estar ordenada por apellidos, nombre o dni). ¿Cómo podría hacerlo?

No encuentro ningún ejemplo para ordenar un map cuya clave sea una clase y su valor un ArrayList de clases.

solución

Una solucion podría ser esta:

Archivo Main.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    private Map<Asignatura, List<Alumno>> map;

    // constructor de la clase Main
    public Main() {
        ArrayList<Alumno> alumnos = new ArrayList<>(15);

        // lista de alumnos
        alumnos.add(new Alumno("Arenas Bustamante", "Eluhuei", "[email protected]", "66565325J"));
        alumnos.add(new Alumno("Valadez Borrego", "Otilia", "[email protected]", "31493438K"));
        alumnos.add(new Alumno("Munguia Aguirre", "Nehuén", "[email protected]", "99883065E"));
        alumnos.add(new Alumno("Ayala Navarrete", "Ivany", "[email protected]", "07109478V"));
        alumnos.add(new Alumno("Villareal Alvarado", "Umbelina", "[email protected]", "61831108R"));
        alumnos.add(new Alumno("Acuna Vanegas", "Onofre", "[email protected]", "30396046M"));
        alumnos.add(new Alumno("Solorio Becerra", "Karen", "[email protected]", "23626376V"));
        alumnos.add(new Alumno("Olivera Barrientos", "Queta", "[email protected]", "45938196C"));
        alumnos.add(new Alumno("Estrada Sosa", "Thina", "[email protected]", "34688652Y"));
        alumnos.add(new Alumno("Pabón Santacruz", "Frutos", "f.pabó[email protected]", "33923603Y"));
        alumnos.add(new Alumno("Gurule Valladares", "Vesta", "[email protected]", "20415549J"));
        alumnos.add(new Alumno("Fonseca Puga", "Yosef", "[email protected]", "33950708V"));

        Asignatura asignatura1 = new Asignatura("Lenguaje", 1, "Pedro Picapiedra", "Departamento 1");

        // añadir al mapa la asignatura y los alumnos creados
        map = new HashMap<>();
        map.put(asignatura1, alumnos);
    }

    public static void main(String[] args) {
        // crear un ejemplar de esta clase
        Main ejemplo = new Main();

        // imprimir por la salida estandar el arreglo
        System.out.println(ejemplo.map.get(new Asignatura(1)));

        // ordenar el arreglo
        Collections.sort(ejemplo.map.get(new Asignatura(1)));

        // imprimir el arreglo ordenado
        System.out.println(ejemplo.map.get(new Asignatura(1)));
    }
}

Archivo Alumno.java

public class Alumno implements Comparable<Alumno> {

    private String apellido;
    private String nombre;
    private String correo;
    private String dni;

    public Alumno(String apellido, String nombre, String correo, String dni) {
        this.apellido = apellido;
        this.nombre = nombre;
        this.correo = correo;
        this.dni = dni;
    }

    @Override
    public int compareTo(Alumno o) {
        String alumno1 = this.apellido.toLowerCase() + this.nombre.toLowerCase();
        String alumno2 = o.apellido.toLowerCase() + o.nombre.toLowerCase();

        return alumno1.compareTo(alumno2);
    }

    @Override
    public String toString() {
        return this.nombre + " " + this.apellido;
    }
}

Archivo Asignatura.java

public class Asignatura {

    private String nombre;
    private int codigo;
    private String profesor;
    private String departamento;

    public Asignatura(int codigo) {
        this.codigo = codigo;
    }

    public Asignatura(String nombre, int codigo, String profesor, String departamento) {
        this.nombre = nombre;
        this.codigo = codigo;
        this.profesor = profesor;
        this.departamento = departamento;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }

        return (obj instanceof Asignatura) && ((Asignatura) obj).codigo == this.codigo;
    }

    @Override
    public int hashCode() {
        return this.codigo;
    }
}

La clase Alumno debe implementar la interfaz Comparable. Esto le permite a Alumno poder ser ordenado. El metodo toString() se sobrescribe para imprimir bien en la linea System.out.println(ejemplo.map.get(...));

En la clase Asignatura se sobrescribe el equals() y el hashCode() para lograr que la key del mapa private Map<Asignatura, List<Alumno>> map; sea el código de la asignatura y permita usar map.get(new Asignatura(1))

Todos los nombres y DNIs fueron generados aleatoriamente.

Tomé como referencia

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *