Volo.java

codice:
package aeroporto;

import java.util.*;

public class Volo
implements Comparable
{
	String key;
	String id; 
	String part;   
	String citta;                                  
	String arr; 

	List<Passeggero> list = new LinkedList<Passeggero>();
 
	public void popolaCampi(Scanner sc)
	{
		id = sc.nextLine();
		part = sc.nextLine();
		citta = sc.nextLine();
		arr = sc.nextLine();
		key = id.concat(part);  
     	}

	public void addPasseggero(Passeggero p)
	{
		if(!p.idVolo.equals(key))
		{
		   throw new IllegalArgumentException(p.toString() + " non vola con " + toString());
		}
		list.add(p);
	}

	public int compareTo(Object o)
	{
		assert o instanceof Volo;
		Volo v = (Volo)o;
		return part.compareTo(v.part);
	}

	public String toString()
	{
		return "<id: " + id + "; giorn part: " + part + "; origine: " + citta + "; ora arrivo: " + arr + ">";
	}
}
Passeggero.java

codice:
package aeroporto;

public class Passeggero
{
	String cognome; 
	String nome; 
	String nazione; 
	String residenza; 
	String idVolo; 


	public void popolaCampi(Java.util.Scanner sc)
	{
		cognome = sc.nextLine();
		nome = sc.nextLine();
		nazione = sc.nextLine();
		residenza = sc.nextLine();
		idVolo = sc.nextLine();
	}

	public String toString()
	{
		return "<Cognome: " + cognome + "; Nome: " + nome + "; Nazionalita: " + nazione + "; Residenza: " + residenza + "; id volo: " + idVolo + ">";
	}
}
Infine aeroporto.java

codice:
package aeroporto;

import java.util.*;
import java.io.*;

public class Aeroporto
{
	Map<String, Volo> voli = new HashMap<String, Volo>();
	Map<String, List<Passeggero>> nazionalita = new HashMap<String, List<Passeggero>>();
	List<Volo> elenco = new LinkedList<Volo>();

	public static void main(String[] argv)
	{
		(new Aeroporto()).exec(argv);
	}

	void exec(String[] argv)
	{
		Scanner stdin = new Scanner(System.in);

		while(true)
		{
			System.out.print("cmd? Leggi/Elenco/Nazionalita/Exit > ");    //r
			String cmd = stdin.nextLine();
			if(cmd == null || cmd.equals("") || cmd.equalsIgnoreCase("exit"))
			{
				break;
			}
			else if(cmd.equalsIgnoreCase("leggi"))
			{
				leggi(stdin);
			}
			else if(cmd.equalsIgnoreCase("elenco"))
			{
				elenco(stdin);
			}
			else if(cmd.equalsIgnoreCase("nazionalita"))
			{
				nazionalita(stdin);
			}
			else
			{
				System.out.println("Comando <" + cmd + "> non riconosciuto");
			}
		}
	}

	void nazionalita(Scanner sc)
	{
		System.out.print("Nazionalita? > ");
		String n = sc.nextLine();
		List<Passeggero> l = nazionalita.get(n);
		System.out.println(String.valueOf(l));
	}

	void elenco(Scanner sc)
	{
		Collections.sort(elenco);
		System.out.println(elenco);
	}

	void leggi(Scanner sc)
	{
		System.out.print("Nome file? > ");
		String nome = sc.nextLine();
		Scanner file = null;
		try
		{
			file = new Scanner(new FileReader(nome));
			while(file.hasNextLine())
			{
				String tipo = sc.nextLine();
				if(tipo.equals("VOLO"))
				{
					Volo v = new Volo();
					v.popolaCampi(file);
					voli.put(v.key, v);

					elenco.add(v);
				}
				else if(tipo.equals("PASSEGGERO"))
				{
					Passeggero p = new Passeggero();
					Volo v = voli.get(p.idVolo);
					v.addPasseggero(p);

					List<Passeggero> l = nazionalita.get(p.nazione);
					if(l == null)
					{
						l = new LinkedList<Passeggero>();
						nazionalita.put(p.nazione, l);
					}
					l.add(p);
				}
				else
				{
					System.out.println("Record tipo <" + tipo + "> non riconosciuto");
					continue;
				}
			}
			file.close();
		}
		catch(IOException ioe)
		{
			ioe.printStackTrace();
		}
	}
}
E' possibile secondo voi migliorare questo codice?
Quale potrebbe essere una soluzione alternativa? Magari al posto delle HashMap utilizzare delle LinkedHashMap, ecc.

Fatemi sapere, grazie!