Hace poco leí una pregunta en Stack Overflow en español sobre cómo ordenar una serie de Monstruos que poseen distintas variables, además de una que coincide en todos, para un juego de rol.
El ordenamiento se me hizo bastante interesante además de un poco complejo en cuanto a conocimientos de programación y del lenguaje y me quedó la duda sobre cómo se puede hacer el ordenamiento consecutivo de un arreglo o vector de clases hijas que heredan de un mismo padre, con base en atributos propios de las clases hijas como de las de la clase padre.
Para empezar la investigación propuse el algoritmo más general posible:
- Se ordena la lista conforme a la primera prioridad
- Aquellas que coincidan (cuyo primer orden de prioridad sea el mismo) se ordenarán de acuerdo al orden i-ésimo de las siguientes prioridades.
El caso propuesto es ordenar un vector de personas (maestros y estudiantes) de acuerdo a características compartidas y específicas de cada una.
Estructura de la herencia
Se tiene una clase Person de la cual heredan las clases Student y Teacher
Clase padre
protected class Person {
private final String name;
private final String lastname;
private final int age;
public Person(String name, String lastname, int age) {
this.name = name;
this.lastname = lastname;
this.age = age;
}
public String getLastname() {
return lastname;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Clases hijas
private static class Teacher extends Person {
private int id;
private final String specialization;
public Teacher(String name, String lastname, int age, int id, String specialization) {
super(name, lastname, age);
this.id = id;
this.specialization = specialization;
}
public int getId() {
return id;
}
@Override
public String toString(){
return String.format(
"%s %s %s\n%s %d\n%s %s\n%s %d",
"Teacher:",
getName(),
getLastname(),
"Age:",
getAge(),
"Specialization:",
specialization,
"id:",
id
);
}
}
private static class Student extends Person {
private double academic_average;
private String group;
public Student(String name, String lastname, int age, double academic_average, String group) {
super(name, lastname, age);
this.academic_average = academic_average;
this.group = group;
}
public String getGroup() {
return group;
}
@Override
public String toString(){
return String.format(
"%s %s %s\n%s %d\n%s %s",
"Student:",
getName(),
getLastname(),
"Age:",
getAge(),
"Group:",
group
);
}
}
Ordenamiento
Se establece el orden de prioridad que tendrá nuestro ordenamiento el cual es:
- Apellido (lastname)
- Nombre (name)
- Personalizado de acuerdo a:
- Student: Grupo (group)
- Teacher: ID (id)
Es decir, tenemos un vector de Personas que serán ordenadas por sus apellidos, luego por su nombre y luego por el ID
Es decir, si existen dos personas con los mismos apellidos se ordenarán esas dos por nombre y si fuera el caso de que siguieran repitiéndose, se ordenarían: si son estudiantes por grupo, si son maestros por ID.