Menu
Coddy logo textTech

Interfaz Comparable

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 72 de 110.

Mientras que == te indica si dos objetos son iguales, a veces necesitas saber cuál va primero. La interfaz Comparable permite ordenar tus objetos definiendo un orden natural.

Para hacer que una clase sea comparable, implementa Comparable<T> y sobrescribe el método compareTo. Este método devuelve un número negativo si this va antes que other, cero si son iguales y un número positivo si this va después:

class Student implements Comparable<Student> {
  String name;
  int grade;
  
  Student(this.name, this.grade);
  
  @override
  int compareTo(Student other) {
    return grade.compareTo(other.grade);
  }
}

void main() {
  var students = [
    Student('Alice', 85),
    Student('Bob', 92),
    Student('Carol', 78),
  ];
  
  students.sort();
  
  for (var s in students) {
    print('${s.name}: ${s.grade}');
  }
  // Carol: 78, Alice: 85, Bob: 92
}

Una vez que tu clase implementa Comparable, puedes usar sort() sin proporcionar un comparador personalizado. Los tipos numéricos y de cadena integrados ya implementan Comparable, por eso grade.compareTo(other.grade) funciona directamente.

Para el orden descendente, simplemente invierte la comparación intercambiando los objetos o negando el resultado:

@override
int compareTo(Student other) {
  return other.grade.compareTo(grade);  // Descendente
}
challenge icon

Desafío

Fácil

¡Construyamos un sistema de gestión de tareas en el que las tareas se puedan ordenar por su nivel de prioridad! Crearás una clase Task que implementa la interfaz Comparable, lo que permite ordenar automáticamente una lista de tareas de la prioridad más alta a la más baja.

Organizarás tu código en dos archivos:

  • task.dart: Crea una clase Task que represente un elemento pendiente con un name (String) y una priority (int, donde los números más altos significan una mayor prioridad). Tu tarea debe implementar Comparable<Task> para que, al ordenarse, las tareas aparezcan en orden descendente según la prioridad (primero la prioridad más alta). También sobrescribe toString() para que devuelva el formato: [name] (Priority: [priority])
  • main.dart: Importa tu archivo de tareas y demuestra cómo la interfaz Comparable permite la ordenación automática. Crea una lista que contenga estas cuatro tareas:
    • 'Write report' con prioridad 2
    • 'Fix critical bug' con prioridad 5
    • 'Update documentation' con prioridad 1
    • 'Review code' con prioridad 3
    Imprime Before sorting: y, después, imprime cada tarea. Ordena la lista usando sort(), imprime una línea vacía y, después, imprime After sorting: seguido de cada tarea nuevamente.

Como tu clase Task implementa Comparable, puedes llamar directamente a sort() en la lista sin proporcionar un comparador personalizado. ¡Las tareas se ordenarán automáticamente según tu implementación de compareTo!

Salida esperada:

Before sorting:
Write report (Priority: 2)
Fix critical bug (Priority: 5)
Update documentation (Priority: 1)
Review code (Priority: 3)

After sorting:
Fix critical bug (Priority: 5)
Review code (Priority: 3)
Write report (Priority: 2)
Update documentation (Priority: 1)

Pruébalo tú mismo

import 'task.dart';

void main() {
  // TODO: Crea una lista de objetos Task con lo siguiente:
  // - 'Write report' con prioridad 2
  // - 'Fix critical bug' with priority 5
  // - 'Update documentation' with priority 1
  // - 'Review code' con prioridad 3
  
  List<Task> tasks = [
    // TODO: Añade las cuatro tareas aquí
  ];
  
  // TODO: Print "Before sorting:"
  // TODO: Imprime cada tarea de la lista
  
  // TODO: Ordena la lista usando sort()
  
  // TODO: Imprime una línea vacía
  
  // TODO: Print "After sorting:"
  // TODO: Imprime cada tarea de la lista ordenada
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online