Per organizzare oggetti dello stesso tipo memorizzati in un array o in una raccolta, gli sviluppatori Java hanno inventato il file
Uno dei modi più semplici ed efficaci per ordinare un array di oggetti è il metodo della
Comparable
. Dichiara un solo metodo compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Un'interfaccia Comparable
è parametrizzata in base al tipo di oggetto che accetta come parametro nel metodo compareTo
. In questo caso, avvisiamo il compilatore quali tipi di oggetti confronteremo. Se la condizione di identità del tipo non è soddisfatta, riceveremo un errore ClassCastException
. Un metodo compareTo
in Java confronta l'oggetto chiamante con l'oggetto passato come parametro e restituisce un numero intero come risultato del confronto:
- positivo se l'oggetto chiamante è più grande dell'oggetto passato come parametro;
- negativo se l'oggetto chiamante è più piccolo dell'oggetto passato come parametro;
- null se gli oggetti sono uguali.
Perché il metodo compareTo è necessario in Java?
Un programmatore Java molto spesso ha a che fare con array ed elenchi di oggetti. Quando si lavora con grandi quantità di dati, spesso è conveniente archiviarli in forma organizzata o ordinata. In primo luogo, accelera il lavoro con la raccolta durante la ricerca delle informazioni necessarie e, in secondo luogo, i dati organizzati vengono percepiti visivamente meglio.sort()
classe Arrays
, e una raccolta di oggetti sotto forma di elenco è un metodo di classe simile Collections
. Per ordinare utilizzando questi metodi, gli sviluppatori Java ci hanno dato la libertà di scegliere come specificare i criteri di ordinamento: implementando l'interfaccia Comparable
nella classe di oggetti che vogliamo ordinare, oppure utilizzando l'estensione Comparator
. Nel primo caso, i metodi di ordinamento accettano un insieme di oggetti sotto forma di array o elenco:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
e nel secondo - più un'altra implementazione dell'interfaccia Comparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
L'interfaccia Comparable
viene utilizzata quando vogliamo impostare un ordine naturale (il più logico dal nostro punto di vista) degli oggetti durante l'ordinamento. È anche un modo per “cablare” l'algoritmo per confrontare oggetti di questa classe in fase di progettazione. Ad esempio, utilizzando l'implementazione di questa interfaccia, vengono definiti i criteri per l'ordinamento naturale nelle classi wrapper dei principali tipi primitivi: , Byte
, Character
, Long
, , Integer
, Short
, Double
, Float
. Ciò significa anche che queste classi hanno un metodo implementato che possiamo utilizzare nel programma se necessario. Diamo un'occhiata ad un esempio di confronto tra stringhe per vedere come questo metodo è implementato nella classe . Boolean
String
compareTo
String
String str1="Аарон";
String str2="АAPOH";
String str3="аарон";
String str4="ААрон";
String str5="аАрон";
String str6="Берта";
String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
Arrays.sort(allStr);
for (String s:allStr){
System.out.println(s);
}
}
Se eseguiamo questo codice nel metodo main
, otterremo il seguente risultato:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Come puoi vedere nell'esempio della classe String
, il metodo compareTo
dispone le stringhe in ordine alfabetico, lessicografico e con distinzione tra maiuscole e minuscole. String
È questo ordine di confronto delle stringhe che viene definito naturale dagli sviluppatori della classe . Per una comprensione più semplice di cos'è l'ordine lessicografico, è sufficiente ricordare come sono disposte le parole nei dizionari di lingua. Quando si confrontano i numeri, gli oggetti vengono ordinati in ordine crescente. Questa logica di confronto è incorporata nelle classi Byte
, Character
, Long
, Integer
, Shor
, Double
, Float
.
Implementiamo il confronto nella nostra classe
Diamo un'occhiata a un esempio di come puoi sviluppare la capacità di confrontare oggetti nella tua classe. Quando implementiamo uncompareto
metodo Java, possiamo specificare uno o più criteri per ordinare gli oggetti e utilizzare anche i metodi compareto
delle classi String
e Integer
. Ad esempio, per gli oggetti classe User
impostiamo l'ordinamento per nome e, in caso di nomi uguali, per età. Gli oggetti verranno disposti nel loro ordine naturale (all'aumentare del valore). Classe User
:
public class User implements Comparable <User>{//добавляем возможность сравнивать an objectы User
private String name;
private Integer age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
@Override
//реализуем метод compareTo интерфейса Comparable
public int compareTo(User o) {
//используем метод compareTo из класса String для сравнения имен
int result = this.name.compareTo(o.name);
//если имена одинаковые - сравниваем возраст,
используя метод compareTo из класса Integer
if (result == 0) {
result = this.age.compareTo(o.age);
}
return result;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
Testiamo il funzionamento del metodo compareTo
implementato nella classe User
utilizzando il metodo sort
class Collections
:
public static void main(String[] args) {
User user = new User("Andrey", 19, "andryha@mail.ru");
User user2 = new User("Олег", 25, "oleg@mail.ru");
User user3 = new User("Andrey", 24,"opr@google.com");
User user4 = new User("Igor", 16, "igor@mail.ru");
User user5 = new User("Andrey", 44,"stary@google.com");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
System.out.println("-------до сортировки--------");
for (User u : list) {
System.out.println(u);
}
System.out.println("-------после сортировки-----");
Collections.sort(list);
for (User u : list) {
System.out.println(u);
}
}
}
}
Risultato del metodo main
:
-------до сортировки--------
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Андрей', age=44, email='stary@google.com'}
-------после сортировки-----
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Андрей', age=44, email='stary@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
Quindi, riassumiamo. Se sei un sostenitore dell'ordine in ogni cosa e desideri disporre i tuoi oggetti in un array o in un elenco senza codice non necessario, utilizza l'interfaccia Comparable
. L'implementazione del suo metodo compareTo rende abbastanza semplice la creazione di un meccanismo per ordinare in modo naturale gli oggetti nella tua classe. Se devi lavorare con raccolte e array di oggetti di classi standard descritte nella libreria Java, utilizza implementazioni già pronte compareTo
in queste classi.
GO TO FULL VERSION