Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 63 di 134
  • livello avanzato
Indice lezioni

Mappe ordinate: TreeMap

Impariamo a sfruttare la classe TreeMap per determinare ordinamenti basati sulle chiavi.
Impariamo a sfruttare la classe TreeMap per determinare ordinamenti basati sulle chiavi.
Link copiato negli appunti

Abbiamo visto nei capitolo precedenti che
HashMap ed HashTable rappresentano la soluzione maggiormente adottata per rappresentare mappe
in Java.

In situazioni in cui è richiesto un ordinamento sulle chiavi possiamo considerare la classe
TreeMap. Si tratta di una classe la cui complessità di tempo per le varie è operazioni è logaritmica nella
dimensione della mappa. L'ordinamento è quindi una funzione in più che otteniamo, rispetto ad HashMap ed HashTable,
perdendo qualcosa in termini di performance.

Nel caso di una TreeMap è importante evidenziare
che le classi utilizzate come chiavi devono produrre oggetti confrontabili. Possiamo rispettare questo requisito facendo
in modo che la classe che rappresenta le chiavi implementi l'interfaccia Comparable, oppure utilizzando un costruttore di TreeMap
che accetti come input un oggetto di una classe che implementi l'interfaccia Comparator.

Vediamo un esempio, realizziamo una TreeMap
che memorizzi le coppie cognome-nome di una persona ordinandole alfabeticamente sul cognome. Creiamo una classe applicativa, TreeMapApp,
che al suo interno contenga la classe per rappresentare una chiave della TreeMap:

public class TreeMapApp {
	static class LastName implements Comparable<LastName> {
		private String value;
		public LastName(String lastName){
		  this.value = lastName;
		}
		@Override
		public int compareTo(LastName lastName) {
			char[] chars1 = this.value.toCharArray();
			char[] chars2 = lastName.value.toCharArray();
			int size1 = chars1.length;
			int size2 = chars2.length;
			int min = size1 > size2 ? size1 : size2;
			for (int i = 0; i < min; i++) {
				int value = Character.compare(chars1[i], chars2[i]);
				if (value < 0) {
					return -1;
				} else if (value > 0) {
					return 1;
				}
			}
			return 0;
		}
		@Override
		public String toString(){
			return value;
		}
	}
	public static void main(String[] args) {
        ....
	}
}

La classe LastName implementa l'interfaccia Comparable specificando se stessa come tipo di comparazione. Comparable richiede di implementare
il metodo compareTo() che nel nostro caso conterrà la logica per determinare quale cognome viene prima di un altro nell'ordinamento alfabetico.
Successivamente nel metodo main creaimo una TreeMap inserendo le entry senza alcun ordinamento:

TreeMap<LastName,String> rubrica = new TreeMap<>();
         rubrica.put(new LastName("Rossi"), "Mario");
         rubrica.put(new LastName("Gialli"), "Laura");
         rubrica.put(new LastName("Marrone"), "Laura");
         rubrica.put(new LastName("Verdi"), "Monica");
         rubrica.put(new LastName("Bianchi"), "Luigi");
         rubrica.put(new LastName("Magenta"), "Osvaldo");
         rubrica.put(new LastName("Neri"), "Luca");

Ed infine testiamo il comportamento della TreeMap per verificare con una stampa che il tutto funzioni correttamente:

rubrica.forEach((lastName,firstName)->
        System.out.println(lastName+"-"+firstName));

Il risultato sulla console di output dovrebbe essere il seguente:

Bianchi-Luigi
Gialli-Laura
Magenta-Osvaldo
Marrone-Laura
Neri-Luca
Rossi-Mario
Verdi-Monica

Ti consigliamo anche