Pergunta

Eu quero ter um List ou Array de algum tipo, armazenar esta informação sobre cada país:

  • código de 2 letras
  • O nome de país como o Brasil
  • Continente / região do mundo como a Europa Oriental, América do Norte, etc.

Vou classificar cada país na região / continente manualmente (mas se existe uma maneira de fazer isso automaticamente, deixe-me saber). Esta pergunta é sobre como armazenar e acessar os países. Por exemplo, eu quero ser capaz de recuperar todos os países na América do Norte.

Eu não quero usar arquivos de texto locais ou tal porque este projecto vai ser convertidos em javascript usando o Google Web Toolkit. Mas armazenar em um outro arquivo de recurso de algum tipo Enum ou, mantendo-o separado do resto do código, é o que eu sou realmente depois.

Foi útil?

Solução

Há 246 países na ISO 3166, você pode obter um grande enum revezamento em volta deste. Eu prefiro usar arquivo XML com lista de países, você pode baixar um de http: // www.iso.org/ e carregá-los (por exemplo, quando a aplicação está a começar). Que, como você precisa deles no GWT carregá-los em volta como chamada RPC, mas lembre-se para armazenar em cache os (algum tipo de carregamento lento) para que você não vai terminar com carga-los cada vez. Eu acho que isso seria de qualquer maneira melhor do que mantê-los em código, como você vai terminar com o carregamento lista completa de cada módulo tempo é acessado, mesmo se o usuário não precisará usar esta lista.

Então, você precisa de algo que vai realizar país:

public class Country
{
    private final String name;
    private final String code;

    public Country(String name, String code)
    {
        this.name = name;
        this.code = code;
    }

    public String getName()
    {
        return name;
    }

    public String getCode()
    {
        return code;
    }

    public boolean equals(Object obj)
    {
        if (this == obj)
        {
            return true;
        }
        if (obj == null || getClass() != obj.getClass())
        {
            return false;
        }

        Country country = (Country) obj;

        return code.equals(country.code);
    }

    public int hashCode()
    {
        return code.hashCode();
    }
}

Para GWT essa classe precisa implementar IsSerializable. E você pode carregar aqueles, no lado do servidor usando:

import java.util.ArrayList;
import java.util.List;
import java.io.InputStream;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class CountriesService
{
    private static final String EL_COUNTRY = "ISO_3166-1_Entry";
    private static final String EL_COUNTRY_NAME = "ISO_3166-1_Country_name";
    private static final String EL_COUNTRY_CODE = "ISO_3166-1_Alpha-2_Code_element";
    private List<Country> countries = new ArrayList<Country>();

    public CountriesService(InputStream countriesList)
    {
        parseCountriesList(countriesList);
    }

    public List<Country> getCountries()
    {
        return countries;
    }

    private void parseCountriesList(InputStream countriesList)
    {
        countries.clear();
        try
        {
            Document document = parse(countriesList);
            Element root = document.getRootElement();
            //noinspection unchecked
            Iterator<Element> i = root.elementIterator(EL_COUNTRY);
            while (i.hasNext())
            {
                Element countryElement = i.next();
                Element countryName = countryElement.element(EL_COUNTRY_NAME);
                Element countryCode = countryElement.element(EL_COUNTRY_CODE);

                String countryname = countryName.getText();
                countries.add(new Country(countryname, countryCode.getText()));
            }
        }
        catch (DocumentException e)
        {
            log.error(e, "Cannot read countries list");
        }
        catch (IOException e)
        {
            log.error(e, "Cannot read countries list");
        }
    }

    public static Document parse(InputStream inputStream) throws DocumentException
    {
        SAXReader reader = new SAXReader();
        return reader.read(inputStream);
    }
}

Claro que, se você precisa encontrar país pela ISO código de 2 letras que você pode não vou mudar de lista para Mapa provavelmente. Se, como você mencionou, você precisa de países separados por continente, você pode estender XML a partir de ISO 3166 e adicionar seus próprios elementos. Basta verificar a sua (website ISO) licença.

Outras dicas

Apenas fazer uma enumeração chamada País. enums Java podem ter propriedades, então não há o código do país e nome. Para o continente, você quer pobably outro enum.

public enum Continent
{
    AFRICA, ANTARCTICA, ASIA, AUSTRALIA, EUROPE, NORTH_AMERICA, SOUTH_AMERICA
}

public enum Country
{
    ALBANIA("AL", "Albania", Continent.EUROPE),
    ANDORRA("AN", "Andorra", Continent.EUROPE),
    ...

    private String code;
    private String name;
    private Continent continent;

    // get methods go here    

    private Country(String code, String name, Continent continent)
    {
        this.code = code;
        this.name = name;
        this.continent = continent;
    }
}

Como para o armazenamento e acesso, um mapa para cada um dos campos que você vai estar procurando, fechado em que esse campo, seria a solução padrão. Desde que você tem vários valores para o continente, você quer ter de usar um Map<?, List<Country>>, ou uma implementação Multimap por exemplo de commons Apache.

Se você freqüentemente precisa fazer uma pesquisa por continente, eu simplesmente fazer uma série de listas imutáveis, um para cada continente, e preenchê-los em conformidade. A lista de países-dados para um continente provavelmente não vai mudar com frequência suficiente para que o custo de reconstruir um array tal de ser reconstruído quando precisa de algo a ser alterado.

Além disso, se você estiver disposto a fazer a classificação do país-continente manualmente, o resto é automático e pode ser feito por meio de programação.

A maneira mais fácil de fazer isso é criar a estrutura do país / continente em Java usando um mapa (ou qualquer coleção) e, em seguida, persistem lo usando XStream

Isto irá criar uma representação XML da coleção, e você pode ler do que em seu processo muito facilmente e convertê-lo de volta para o mesmo tipo de coleção que você criou inicialmente. Além disso, porque é XML, você pode facilmente editá-lo fora do código. ou seja, apenas em um editor de texto.

Veja a XStream tutorial para mais informações.

usando o objeto Locale é a melhor solução que eu posso pensar, você não precisa armazenar nada. Mas se você estiver usando GWT tentar fazer isso no lado do servidor, como alguns dizem que você não vai fazê-lo funcionar corretamente no lado do cliente (como ele é traduzido para javascript), você pode enviá-los para o cliente em uma RPC como afirmado antes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top