ProgrammazioneSviluppatore Backend

Descrivi le differenze tra l'interfaccia Comparable e Comparator in Java. Come implementarle correttamente e applicarle per ordinare oggetti personalizzati?

Supera i colloqui con l'assistente IA Hintsage

Risposta

Comparable è un'interfaccia che viene implementata dalla stessa classe dell'oggetto. Definisce un metodo compareTo(), che determina l'ordine naturale di ordinamento.

Comparator è un'interfaccia separata che implementa il metodo compare(o1, o2). Permette di definire diversi modi di ordinare senza modificare il codice della classe stessa.

Quando utilizzare:

  • Se la classe ha logicamente solo un modo naturale di ordinamento — implementare Comparable.
  • Se è necessaria la supporto per più modi di ordinamento — creare i relativi Comparator.

Esempi:

// Comparable class Student implements Comparable<Student> { String name; int grade; public int compareTo(Student other) { return this.grade - other.grade; } } // Comparator Comparator<Student> byName = new Comparator<Student>() { public int compare(Student s1, Student s2) { return s1.name.compareTo(s2.name); } }; List<Student> students = ...; Collections.sort(students); // ordinamento per grade Collections.sort(students, byName); // ordinamento per name

Domanda trabocchetto

Si può ordinare un List di oggetti che non implementano Comparable, senza un Comparator?

Risposta: No. Se la classe non implementa Comparable e non viene fornito esplicitamente un Comparator, il tentativo di ordinare la collezione porterà a un'eccezione ClassCastException.

Esempio:

class Animal {} List<Animal> animals = ...; Collections.sort(animals); // ClassCastException se non c'è Comparable

Storia

Nel progetto di inventario, ho dimenticato di implementare Comparable per la classe Item. Ho tentato di ordinare tramite Collections.sort(items). Di conseguenza, l'applicazione è costantemente crashata con ClassCastException a causa della mancanza del metodo compareTo().


Storia

Nel servizio di calcolo dei punteggi degli studenti, lo sviluppatore ha implementato il confronto per il campo grade solo nel metodo compareTo(). Successivamente, si è reso necessario ordinare per nome e data di nascita, ma il codice della classe è cresciuto con metodi ausiliari, invece di utilizzare diversi Comparator ed evitare una logica complessa in compareTo().


Storia

Nel prodotto per ordini online, hanno cercato di utilizzare Comparator con un'espressione lambda per ordinare gli ordini per data, ma hanno dimenticato di considerare la possibilità di valori null per la data. Risultato — inesperati NullPointerException in produzione durante l'ordinamento degli ordini senza data di consegna.