Demonstração de código: Incluir paises, vizinhos, Listar Países

Na verdade isso não eh duvida, é só para alguém que for desenvolver um programa como esse estiver alguma dúvida

package paises;

import java.io.*;
import java.text.NumberFormat;
import java.util.*;

public class Paises {

    private static Scanner leia = new Scanner(System.in);
    private static ArrayList<Pais> paises = new ArrayList<Pais>();
    final static private String NOME_ARQ_PAISES = "paises.txt";
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        int opcao;
        do
        {
            opcao = menu();
            switch(opcao)
            {
                case 1: incluiPais(); break;
                case 2: incluiVizinhos(); break;
                case 3: listarPaises(); break;
                case 4: paisesVizinhos(); break;
                case 5: densidadePopulacional(); break;
                case 6: vizinhosEmComum(); break;
                case 7: lerDados(); break;
                case 8: gravarDados(); break;
            }
        }while(opcao != 9);
    }
    
    private static int menu(){
        System.out.println();
        System.out.println("+============================+");
        System.out.println("|        O P Ç Õ E S         |");
        System.out.println("+============================+");
        System.out.println("| 1. Incluir País            |");
        System.out.println("| 2. Incluir Vizinhos        |");
        System.out.println("| 3. Listar Países           |");
        System.out.println("| 4. Países são Vizinhos?    |");
        System.out.println("| 5. Densidade Populacional  |");
        System.out.println("| 6. Vizinhos em Comum       |");
        System.out.println("| 7. Ler Dados em Arquivo    |");
        System.out.println("| 8. Gravar Dados em Arquivo |");
        System.out.println("| 9. Encerrar o Programa     |");
        System.out.println("+============================+");

        int opcao;
        do {
            try {
                System.out.print("Digite a sua opção (1 a 9): ");
                opcao = leia.nextInt();
            }
            catch(Exception e)
            {
                leia.nextLine();
                opcao = 0;
            }
        }while (opcao < 1 || opcao > 9);
        
        return opcao;
    }
    
    static void incluiPais()
    {
        Pais novo;
        String codigo;
        String nome;
        String capital;
        long populacao;
        long area;

        while(true) {
            System.out.println();
            System.out.println("----------------");
            System.out.println("Inclusão de País:");
            System.out.print("   Código ISO (ou 'Fim' para encerrar): ");
            codigo = leia.next();
            
            if (codigo.equalsIgnoreCase("fim"))
                break;

            // verificar se país já foi inserido na lista
            if (buscaPais (codigo) != null) {
                System.out.println("ERRO: País já cadastrado.");
                continue;
            }
            System.out.print("   Nome.....: ");
            do {
                nome = leia.nextLine();
            }while (nome.isEmpty());
            
            System.out.print("   Capital..: ");
            do {
                capital = leia.nextLine();
            }while (capital.isEmpty());
            
            do
            {
                try{
                    System.out.print("   População: ");
                    populacao = leia.nextLong();
                }            
                catch (Exception e) {
                    System.out.println(" Favor digitar um número inteiro.");
                    populacao = -1;
                    leia.nextLine();
                }
            }while (populacao < 0);
            
            System.out.print("   Área.....: ");
            area = leia.nextLong();
            
            novo = new Pais (codigo, nome, capital, populacao, area);
            paises.add(novo);
        }
    }
    
    // verificar se país já foi inserido na lista
    private static Pais buscaPais (String codigo) {
        for (Pais p: paises) {
            if (p.getCodigo().equalsIgnoreCase(codigo)) {
                return p;
            }
        }
        return null;
    }
    
    private static void incluiVizinhos()
    {
        String codigo;
        
        while (true) {
            System.out.println();
            System.out.println("----------------");
            System.out.println("Inclusão de Vizinhos:");

            System.out.print("   Código ISO do País(ou 'Fim' para encerrar): ");
            codigo = leia.next();
            if (codigo.equalsIgnoreCase("fim"))
                break;

            // verificar se país já foi inserido na lista
            Pais p = buscaPais (codigo);
            if (p == null) {
                System.out.println("ERRO: País não encontrado.");
                continue;
            }
            
            // inclusao dos vizinhos
            while (true) {
                System.out.print("   Código ISO do Vizinho(ou 'Fim' para encerrar): ");
                codigo = leia.next();
                if (codigo.equalsIgnoreCase("fim"))
                    break;
                
                if (codigo.equalsIgnoreCase(p.getCodigo())){
                    System.out.println("ERRO: país não pode ser vizinho dele mesmo.");
                    continue;
                }
                
                // verifica se código do vizinho é válido
                Pais p1 = buscaPais(codigo);
                if(p1 == null){
                    System.out.println("ERRO: Vizinho não encontrado.");
                }
                else {
                    // adiciona vizinho
                    p.addVizinho(codigo);
                    
                    // adicionar vizinhança dupla
                    p1.addVizinho(p.getCodigo());
                }
            }
        }
    }
    
    private static void listarPaises()
    {
        for (Pais p: paises) {
            p.mostraDados();
            System.out.println();
        }
    }
    
    private static void paisesVizinhos()
    {
        String codigo;
        int i;
        boolean bFim = false;
        Pais p, p1 = null, p2 = null;
        
        while (true) {
            System.out.println();
            System.out.println("----------------");
            System.out.println("Indica se dois países são vizinhos:");

            i = 0;
            while (i < 2) {
                System.out.print("   Código ISO do " + (i + 1) + "o. País(ou 'Fim' para encerrar): ");
                codigo = leia.next();
                if (codigo.equalsIgnoreCase("fim"))
                {
                    bFim = true;
                    break;
                }

                // verificar se país já foi inserido na lista
                p = buscaPais (codigo);
                if (p == null) {
                    System.out.println("ERRO: País não encontrado.");
                    continue;
                }
                
                if (i == 0)
                    p1 = p;
                else
                    p2 = p;
                ++i;
            }
            if (bFim)
                break;
            
            // verifica se paises sao vizinhos
            System.out.print (p1.getCodigo() + " e " + p2.getCodigo());
            if (p1.seVizinho (p2))
                System.out.println (" são vizinhos!");
            else
                System.out.println (" não são vizinhos!");
            
        }
    }
    
    private static void densidadePopulacional()
    {
        String codigo;
        
        while (true) {
            System.out.println();
            System.out.println("----------------");
            System.out.println("Densidade Populacional:");

            System.out.print("   Código ISO do País(ou 'Fim' para encerrar): ");
            codigo = leia.next();
            if (codigo.equalsIgnoreCase("fim"))
                break;

            // verificar se país já foi inserido na lista
            Pais p = buscaPais (codigo);
            if (p == null) {
                System.out.println("ERRO: País não encontrado.");
                continue;
            }
            
            // mostra a densidade populacional do país
            System.out.println ("Densidade Populacional: " +
                    NumberFormat.getNumberInstance().format(p.densidade()) +
                    " habitantes / Km2");
            
        }
    }
    
    private static void vizinhosEmComum()
    {
        String codigo;
        int i, j;
        boolean bFim = false, bAchou;
        Pais p;
        ArrayList<String> v1 = null, v2 = null;
        
        while (true) {
            System.out.println();
            System.out.println("----------------");
            System.out.println("Lista vizinhos em comum entre dois países:");

            i = 0;
            while (i < 2) {
                System.out.print("   Código ISO do " + (i + 1) + "o. País(ou 'Fim' para encerrar): ");
                codigo = leia.next();
                if (codigo.equalsIgnoreCase("fim"))
                {
                    bFim = true;
                    break;
                }

                // verificar se país já foi inserido na lista
                p = buscaPais (codigo);
                if (p == null) {
                    System.out.println("ERRO: País não encontrado.");
                    continue;
                }
                
                if (i == 0)
                    v1 = p.getVizinhos();
                else
                    v2 = p.getVizinhos();
                ++i;
            }
            if (bFim)
                break;
            
            // lista vizinhos em comum
            bAchou = false;
            System.out.print ("Vizinhos em comum:");
            for (i = 0; i < v1.size(); ++i){
                if (v2.indexOf(v1.get(i)) >= 0)
                {
                    bAchou = true;
                    System.out.print (" " + v1.get(i));
                }
            }
            if (bAchou)
                System.out.println ("");
            else
                System.out.println (" nenhum.");

        }
    }
    
    private static void lerDados()
    {
        File arquivo = new File(NOME_ARQ_PAISES);
        Pais p;
        String linha;
        String[] vet;
        int i;

        if (!arquivo.exists()) {
            System.out.println ("Arquivo de dados não existe!");
            return;
        }

        // limpar países
        paises.clear();
        
        try
        {
            //faz a leitura do arquivo
            FileReader fr = new FileReader(arquivo);
            BufferedReader br = new BufferedReader(fr);

            // leitura dos dados dos paises (enquanto houver linhas)
            while (br.ready())
            {
                //lê a proxima linha
                linha = br.readLine();
                vet = linha.split(";");

                p = new Pais (vet[0], vet[1], vet[2],
                              Long.parseLong(vet[3]),
                              Long.parseLong(vet[4]));
                paises.add (p);
                
                // adiciona vizinhos
                for (i = 5; i < vet.length; ++i) {
                     p.addVizinho(vet[i]);
                }
            }

            br.close();
            fr.close();
            
            System.out.println ("Dados lidos com sucesso!");
            System.out.println ("Total de países lidos: " + paises.size());

        } catch (IOException ex) {
            System.out.println ("ERRO: leitura do arquivo de dados!");
        }
    }
    
    private static void gravarDados()
    {
        File arquivo = new File(NOME_ARQ_PAISES);
        ArrayList<String> vizinhos;

        try
        {
            // cria o arquivo (caso ele não exista)
            arquivo.createNewFile();

            // variáveis para manipulação do arquivo
            FileWriter fw = new FileWriter(arquivo, false);
            BufferedWriter bw = new BufferedWriter(fw);

            // grava dados das contas
            String linha;   // dados a serem gravados no arquivo
            for (Pais p : paises)
            {
                linha = p.getCodigo() + ";" + p.getNome() + ";" +
                        p.getCapital() + ";" +
                        Long.toString(p.getPopulacao()) + ";" +
                        Long.toString(p.getArea());
                
                // adiciona vizinhos
                vizinhos = p.getVizinhos();
                for (String cod : p.getVizinhos()) {
                    linha += ";" + cod;
                }
                
                bw.write(linha);
                bw.newLine();
            }

            bw.close();
            fw.close();
            
            System.out.println ("Dados gravados com sucesso!");
            System.out.println ("Total de países gravados: " + paises.size());

        } catch (IOException ex) {
            System.out.println("ERRO: gravação do arquivo de dados!");
            System.out.println(ex.getLocalizedMessage());
        }    
    }
}
---------------------------------------------------------------------------------------------------------------------------------
package paises;

import java.text.NumberFormat;
import java.util.ArrayList;


public class Pais {
    private String codigo;
    private String nome;
    private String capital;
    private long populacao;
    private long area;
    private ArrayList<String> vizinhos;
    
    Pais(String codigo, String nome, String capital,
            long populacao, long area)
    {
        this.codigo = codigo;
        this.nome = nome;
        this.capital = capital;
        this.populacao = populacao;
        this.area = area;
                
        // criar lista de vizinhos
        vizinhos = new ArrayList<String>();
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCapital() {
        return capital;
    }

    public void setCapital(String capital) {
        this.capital = capital;
    }

    public long getPopulacao() {
        return populacao;
    }

    public void setPopulacao(long populacao) {
        this.populacao = populacao;
    }

    public long getArea() {
        return area;
    }

    public void setArea(long area) {
        this.area = area;
    }

    public ArrayList<String> getVizinhos() {
        return vizinhos;
    }

    public void setVizinhos(ArrayList<String> vizinhos) {
        this.vizinhos = vizinhos;
    }
    
    public void addVizinho(String codigo) {
        if (vizinhos.indexOf(codigo) < 0)
            vizinhos.add(codigo.toUpperCase());
    }
    
    public float densidade()
    {
        if (area == 0)
            return 0;
        else
            return (float)populacao / area;
    }

    public boolean equals(Pais p) {
        return codigo.equals(p.codigo);
    }

    public boolean seVizinho (Pais p){
        return (vizinhos.indexOf(p.codigo.toUpperCase()) >= 0);
    }
    
    public ArrayList<String> vizinhosEmComum(Pais p) {
        ArrayList<String> emComum = new ArrayList<String>();
        
        for (String cod : vizinhos) {
            if (p.vizinhos.indexOf(cod) >= 0)
                emComum.add(cod);
        }
        
        return emComum;
    }
    
    public void mostraDados () {
        System.out.println (codigo + " - " + nome);
        System.out.println ("    Capital: " + capital);
        
        System.out.println ("    Populacao: " +
                NumberFormat.getNumberInstance().format(populacao));
        
        System.out.println ("    Área: " +
                NumberFormat.getNumberInstance().format(area) + " Km2");
        
        if (vizinhos.size() > 0)
        {
            System.out.print ("    Vizinhos:");
            for (String str : vizinhos) {
                System.out.print(" " + str);
            }
            System.out.println();
        }
    }
}