
// Tipi di dato complessi (motivazione)

public class Esempio16 {
    
	public static void main(String[] args) {
		
		// Supponiamo di dovere memorizzare una lista di nomi di persona con associato
		// numero telefonico. Per semplicità supponiamo che ogni persona abbia esattamente
		// un numero di telefono. Come rappresentare questa informazione?
		
		// Un modo possibile è il seguente:
		
		int persone = 10; // numero di persone
		String[] nomi;    // nomi delle persone (vettore di stringhe)
		String[] tel;     // numeri di telefono
		// Alloco memoria per i nomi e i telefoni
		nomi = new String[persone];
		tel = new String[persone];
		// Inizializzo
		nomi[0] = "Mario";
		tel[0]  = "555-231";
		nomi[1] = "Giuseppe";
		tel[1]  = "555-232";
		nomi[2] = "Asdrubale";
		tel[2]  = "555-624";
		// ... eccetera
		
		// Questo modo di rappresentare l'informazione è sufficiente a svolgere le operazioni
		// più comuni come per esempio la ricerca di un numero telefonico dato un nome di persona.
		
		// Tuttavia, rappresentare i dati in questo modo è piuttosto discutibile.
		// Il problema è che concettualmente i nostri dati sono una sequenza di persone,
		// dove ogni persona ha nome e telefono. La rappresentazione naturale sarebbe quindi
		// un array di coppie < String nome, String telefono >. Invece, sopra abbiamo usato
		// una coppia di array: sia "nomi" che "tel" sono array.
		
		// Avere due array indipendenti può indurre all'errore. Per esempio:
		//
		// *** 1) Nulla obbliga il programmatore a fare sì che i due array abbiano la stessa
		// lunghezza. È il programmatore che si deve preoccupare di mantenere questa invariante
		// nella sua rappesentazione.
		//
		// *** 2) Per velocizzare la ricerca del telefono dato il nome, potrei ordinare l'array
		// dei nomi in modo crescente, così da potere dopo usare le ricerca binaria. Quando
		// lo faccio però devo ricordarmi di permutare anche i telefoni allo stesso modo, o
		// mi perdo l'associazione nome-telefono!
		//
		// *** 3) Se decido di aggiungere anche un indirizzo per ogni persona, devo allocare un
		// terzo array. Questo mi costringe di nuovo a modificare l'ordinamento delle persone
		// sui nomi: ora devo permutare anche gli indirizzi.
		//
		// Tutti questi problemi non esisterebbero se usassi un array di coppie. In tal caso
		// avrei una sola lunghezza (risolve 1). Ordinando un array di coppie con per es. il
		// merge sort, scambierei gli elementi dell'array, che sarebbero coppie. Questo non
		// "spezza" mai le coppie e di conseguenza non si perderebbe mai l'associazione
		// nome-telefono (risolve 2). Se aggiungo un indirizzo, passo ad un array di triple
		// senza problemi: l'ordinamento continua a scambiare gli elementi dell'array, che
		// ora diventerebbero triple, e quindi gli indirizzi vengono automaticamente permutati.
		
	}

}
