Лучший способ сохранить Коды страны, имена и Континент в Java

Категории итераторов кодируют уровней функциональности .

  • Входной итератор - это минимальный минимальный уровень - наращиваемый и разыменовываемый один раз
  • Прямой итератор - это входной итератор, который можно разыменовывать несколько раз и имеет многопроходность служба поддержки.
  • Двунаправленный итератор - это прямой итератор, который вы можете уменьшить
  • Случайный итератор - это двунаправленный итератор, который вы можете на O (1) продвинуться на +/- n
  • [ 1117] Непрерывный итератор - это итератор произвольного доступа, который ссылается на непрерывную память

Эти уровни функциональности используются алгоритмами - некоторые алгоритмы требуют определенного уровня функциональности, некоторые алгоритмы можно просто оптимизировать на основе определенных уровней функциональности (например, advance(it, n) для итераторов с произвольным доступом можно просто выполнить it += n, тогда как для прямых итераторов это должно быть ++it в цикле).

Но «обратное» - это не уровень функциональности - это просто другой способ представления базовых данных. Обращенный итератор не заслуживает своей собственной категории итераторов по той же причине, по которой итератор «move» не делает, или «фильтрованный» итератор не делает, или «посчитанный» итератор - нет. Алгоритмы не заботятся, обращены ли итераторы или нет - они работают одинаково в любом случае. Не важно, каким образом ++it фактически перемещает итератор.

Обратные итераторы - это просто итераторы. std::reverse_iterator известен как адаптер итератора (наряду с кучей других, таких как std::move_iterator ) - это итератор, который адаптирует другой итератор. Но вы могли бы написать обратный итератор, который не является адаптером - действительно, вы могли бы даже написать обратный итератор, который не является двунаправленным! Эти два понятия являются ортогональными. [+1121]

8
задан Click Upvote 3 April 2009 в 12:12
поделиться

4 ответа

Существует 246 стран в ISO 3166, Вы могли бы получить релейное большое перечисление на задней части этого. Я предпочитаю использовать XML-файл со списком стран, можно загрузить один с http://www.iso.org/ и загрузить их (например, когда приложение запускается). Чем, поскольку Вам нужны они в GWT, загружают их в назад как вызов RPC, но не забывают кэшировать их (некоторая ленивая загрузка) так Вы конец привычки с загрузкой их каждый раз. Я думаю, что это было бы так или иначе лучше, чем содержание их в коде, поскольку Вы закончите с загрузкой полного списка каждый раз, когда к модулю получают доступ, даже если пользователь не должен будет использовать этот список.

Таким образом, Вам нужно что-то, что будет содержать страну:

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

Для GWT этот класс должен был бы реализовать IsSerializable. И можно загрузить их на серверном использовании:

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

Конечно, если необходимо найти страну алфавитным кодом ISO 2, Вы могли бы привычка изменить Список для Отображения, вероятно. Если, поскольку Вы упомянули, Вы должны разделить страны континентом, Вы могли бы расширить XML от ISO 3166 и добавить Ваши собственные элементы. Просто проверьте их (веб-сайт ISO) лицензия.

5
ответ дан 5 December 2019 в 06:39
поделиться

Просто сделайте перечисление под названием Страна. Перечисления Java могут иметь свойства, таким образом, существует Ваш код страны и имя. Для континента Вы pobably хотите другое перечисление.

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

Что касается хранения и доступа, одной Карты для каждого из полей, которые Вы будете искать, включил тот, что поле, будет стандартное решение. Так как у Вас есть несколько значений для континента, необходимо будет или использовать a Map<?, List<Country>>, или Мультиреализация Map, например, от свободного городского населения Apache.

14
ответ дан 5 December 2019 в 06:39
поделиться

Если бы часто необходимо делать поиск континентом, я просто сделал бы ряд неизменных списков, один для каждого континента, и заполнил бы их соответственно. Список данных страны для континента, вероятно, не собирается изменяться достаточно часто для стоимости восстановления такого массива, который будет восстановлен, когда что-то должно быть изменено.

Кроме того, если Вы готовы сделать сдержанную страной классификацию вручную, остальное автоматически и может быть сделано программно.

4
ответ дан 5 December 2019 в 06:39
поделиться

Самый легкий способ сделать это должно создать структуру страны/континента в Java с помощью карты (или безотносительно набора) и затем сохранить его с помощью XStream

Это создаст представление XML набора, и можно читать, чем в процесс очень легко и преобразовать его назад в тот же тип набора, который Вы первоначально создали. Кроме того, потому что это - XML, можно легко отредактировать его за пределами кода. т.е. только в текстовом редакторе.

См. учебное руководство XStream для большего количества информации.

2
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: