Meilleur moyen de stocker les codes de pays, les noms et le continent en Java


Je veux avoir un List ou Array d'une sorte quelconque, stockant ces informations sur chaque pays:

  • code à 2 lettres
  • Nom du pays tel que le Brésil
  • Continent/région du monde comme l'Europe de l'Est, l'Amérique du Nord, etc.

Je classerai chaque pays dans la région/continent manuellement (mais s'il existe un moyen de le faire automatiquement, faites-le moi savoir). Cette question porte sur la façon de stocker et d'accéder aux pays. Par exemple, j' vous voulez être en mesure de récupérer tous les pays en Amérique du Nord.

Je ne veux pas utiliser de fichiers texte locaux ou autres car ce projet sera converti en javascript à l'aide de Google Web Toolkit. Mais stocker dans une énumération ou un autre fichier de ressources, en le gardant séparé du reste du code, est ce que je recherche vraiment.

Author: Click Upvote, 2009-04-03

5 answers

Il y a 246 pays dans ISO 3166, vous pourriez obtenir une grande énumération de relais à l'arrière de cela. Je préfère utiliser le fichier XML avec la liste des pays, vous pouvez en télécharger un à partir de http://www.iso.org / et chargez-les (par exemple lorsque l'application démarre). Que, comme vous en avez besoin dans GWT, chargez - les en arrière en tant qu'appel RPC, mais n'oubliez pas de les mettre en cache (une sorte de chargement paresseux) afin que vous ne finissiez pas de les charger à chaque fois. Je pense que ce serait de toute façon mieux que de les tenir dans le code, car vous finirez par charger liste complète à chaque fois que le module est accessible, même si l'utilisateur n'aura pas besoin d'utiliser cette liste.

Vous avez donc besoin de quelque chose qui tiendra le pays:

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();
    }
}

Pour GWT, cette classe devrait implémenter IsSerializable. Et vous pouvez les charger, côté serveur en utilisant:

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);
    }
}

Bien sûr, si vous avez besoin de trouver un pays par code de lettre ISO 2, vous ne changerez peut-être pas de liste pour cartographier probablement. Si, comme vous l'avez mentionné, vous avez besoin de pays distincts par continent, vous pouvez étendre XML à partir d'ISO 3166 et ajouter vos propres éléments. Il suffit de vérifier leur licence (site Web ISO).

 5
Author: Konrad, 2009-04-03 13:43:01

Il suffit de faire une énumération appelée Country. Les énumérations Java peuvent avoir des propriétés, il y a donc votre code de pays et votre nom. Pour le continent, vous voulez pobably une autre énumération.

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;
    }
}

En ce qui concerne le stockage et l'accès, une carte pour chacun des champs que vous rechercherez, saisie sur ce champ, serait la solution standard. Comme vous avez plusieurs valeurs pour le continent, vous devrez soit utiliser un Map<?, List<Country>>, soit une implémentation Multimap, par exemple à partir d'Apache commons.

 14
Author: Michael Borgwardt, 2013-01-17 08:19:58

Si vous avez souvent besoin de faire une recherche par continent, je ferais simplement une série de listes immuables, une pour chaque continent, et les remplirais en conséquence. La liste des données par pays pour un continent ne changera probablement pas assez fréquemment pour que le coût de reconstruction d'un tel tableau soit reconstruit lorsque quelque chose doit être modifié.

De plus, si vous êtes prêt à faire la classification pays-continent manuellement, le reste est automatique et peut être fait par programmation.

 4
Author: John Feminella, 2009-04-03 12:17:57

La façon la plus simple de le faire est de créer la structure pays/continent en Java à l'aide d'une carte (ou de n'importe quelle collection), puis de la conserver à l'aide de XStream

Cela créera une représentation XML de la collection, et vous pourrez lire que dans votre processus très facilement et le convertir au même type de collection que vous avez initialement créé. De plus, comme il s'agit de XML, vous pouvez facilement le modifier en dehors du code. c'est à dire juste dans un éditeur de texte.

Voir le XStream tutoriel pour plus d'informations.

 2
Author: Brian Agnew, 2009-04-03 13:40:40

L'utilisation de l'objet Locale est la meilleure solution à laquelle je puisse penser, vous n'auriez pas besoin de stocker quoi que ce soit. Mais si vous utilisez GWT, essayez de le faire côté serveur, car certains disent que vous ne le ferez pas fonctionner correctement côté client (car il est traduit en javascript), vous pouvez les envoyer au client dans un RPC comme indiqué précédemment.

 0
Author: zeacuss, 2012-01-19 01:24:03