nooooooooooo nn sono mai volgare quindi metto gli asterischi.. :P
***** sei un genio!! beh certo hai anche tanta esperienza 
non avevo pensato che, in questa funzione:
codice:
private int comparaPersone(Persona p1, Persona p2) {
int r = p1.getCognome().compareTo(p2.getCognome());
if (r == 0) {
r = p1.getNome().compareTo(p2.getNome());
}
return r;
}
effettivamente se restituisco il valore dopo aver confrontato il nome non me ne faccio piu' niente del valore del cognome! il valore del nome comprendera' anche quello del cognome!!
no davvero sei un genio!
dispendio di energia ZERO!!
davvero sei stato utilissimo!! finalmente capisco cosa intendevi con il creare una funzione che compara sia il cognome che il nome!
per verificare anche l'anno di nascita etcetera basta che nidifico gli if e restituisco il valore dell'anno!
sono davvero sbalordito! credimi!!
non so come ringraziarti :P
ma permettimi di approfittare del tuo genio e della tua esperienza per una domanda.. ^^
nell'escamotage che ho trovato io mi puoi spiegare cortesemente:
- il valore stringa che passo alla funzione per scegliere quale valore ottenere perche' e' cosi' "assurdo"
- e i cicli while nidificati perche' ti "impressionano" tanto (immagino per il dispendio di tempo e dati che devi analizzare il programma per restituire)
infine lascia che ti ringrazi almeno altre mille volte per l'aiuto che mi hai fornito!
e' davvero una lezione di vita, anzi di programmazione(!!), e una lezione che arricchisce il mio "problem solving" in programmazione! 
grazie ancora!!
angelo
EDIT:
inoltre non avevo valutato che nella "comparazione" delle stringhe
codice:
r = p1.getNome().compareTo(p2.getNome());
e' inutile che vada a fare p1.info.cognome ma semplicemente richiamare la funzione che me lo restituisce!
c'é sempre da imparare!! fortuna che esistono persone come te che mi "allertano" sulle mie malefatte e su come ottimizzare il lavoro^^