Interfaces Comparator y Comparable (II)

Lo prometido es deuda y ahora que tengo un slot libre de tiempo aquí tenéis el ejemplo que ilustra la primera parte de éste artículo. Podréis observar que al implementar el interfaz Comparable mediante la sobrecarga o implementación, del método abstracto (ver comentarios), compareTo(…) se ha utilizado el mismo método que proporciona Integer. De forma similar se hubiera podido implementar cualquier comparación devolviendo los valores indicados, en el “contrato” de la interfaz, según nuestro propio criterio. En este caso se ha modificado el valor devuelto, multiplicándolo por -1, para obtener la ordenación inversa, tal y como lo mencionó ‘jsanca’ en el comentario a la primera parte publicada también el DebugModeOn.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.util.Vector;
import java.util.Iterator;
import java.util.Collections;
 
public class Persona implements Comparable<persona> {
	private String miNombre;
	private Integer miEdad;
	private Float miAltura;
 
	public Persona(String nombre, int edad, double altura) {
		this.miNombre = new String(nombre);
		this.miEdad = new Integer(edad);
		this.miAltura = new Float(altura);
	}
 
	/**
	 * Return a negative integer,
	 * zero, or a positive integer as
	 * this object is less than, equal to,
	 * or greater than the specified object.
	 */
	public int compareTo(Persona per) {
		// Multiplicamos por -1 para obtener la ordenación
		// inversa como apuntó 'jsanca' en su comentario.
		return this.miEdad.compareTo(per.getEdad()) * -1;
	}
 
	public Integer getEdad() {
		return miEdad;
	}
 
	public void setEdad(int edad) {
		this.miEdad = new Integer(edad);
	}
 
	public Float getAltura() {
		return miAltura;
	}
 
	public void setAltura(double altura) {
		this.miAltura = new Float(altura);
	}
 
	public String toString() {
		StringBuffer result = new StringBuffer();
		result.append("Me llamo " + this.miNombre);
		result.append(", tengo " + this.miEdad);
		result.append(" y mi altura es " + this.miAltura);
		return result.toString();
	}
 
	/**
	 * Main para probar la clase.
	 */
	public static void main(String[] args) {
		// Franc
		Persona franc = new Persona("Franc", 38, 1.78);
		// Rosa
		Persona rosa = new Persona("Rosa", 29, 1.67);
		// Maite
		Persona maite = new Persona("Maite", 37, 1.98);
 
		// Creo una comunidad de personas.
		Vector miComunidad = new Vector();
		miComunidad.add(franc);
		miComunidad.add(rosa);
		miComunidad.add(maite);
 
		// Ordeno por edad la comunidad de personas.
		Collections.sort(miComunidad);
 
		// Ya se puede listar la comunidad ordenada.
		Iterator personaIter = miComunidad.iterator();
		System.out.println("Comunidad ordenada por edad.");
		while (personaIter.hasNext())
			System.out.println(personaIter.next());
	}
}

El resultado de la ejecución es el siguiente:
Mi comunidad ordenada por edad.
Me llamo Franc, tengo 38 y mi altura es 1.78
Me llamo Maite, tengo 37 y mi altura es 1.98
Me llamo Rosa, tengo 29 y mi altura es 1.67

Nos vemos en la próxima y última parte donde comentaré el uso de la interfaz Comparator.

  1. Y la sobrecarga de compareTo ¿donde está?

  2. Debajo del constructor de la clase Persona.

  3. Yo no lo veo como una sobrecarga sino el desarrollo de un método abstracto.

    Sobrecarga sería si hubiera varios métodos llamados igual pero con diferente firma.

  4. A mi modo de ver, la implementación de una interfaz es una forma de implementar herencia múltiple cuando el lenguaje no la soporta. Por ésta razón a mi entender es correcto hablar de sobrecarga en este punto. Claro que tú observación también es correcta y posiblemente más acertada cuando se citan ejemplos de Java. Meditaré una explicación para evitar confusiones.

  5. Freaky!!!! Felices fiestas 😀

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>