Переписать карту Ruby на карту Java - PullRequest
1 голос
/ 05 октября 2019

У меня есть такая структура Ruby:

COUNTRIES = {
      'AF' => { :country => 'Afghanistan', :alpha => 'AFG', :number => '004' },
      'AT' => { :country => 'Austria', :alpha => 'AUT', :number => '040' }
}

Какую структуру данных я могу использовать, чтобы создать ту же структуру и найти правильное значение, основываясь на ключе, который мне нужен? Я попробовал это с помощью Gualava:

Table<String, String, Integer> table = HashBasedTable.create();

table.put("Austria", "AUT", 040);

Но как мне сопоставить основной ключ AT? Может быть, с помощью таблицы в Hashmap? Но тогда как я могу получить значения из Hashmap, используя некоторый внутренний ключ>

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Идиоматический способ записать это на Java таков:

public class Country {
    private final String country;
    private final String alpha;
    private final String number;
    // constructor and getters
}

Map<String, Country> map = new HashMap<>();
COUNTRIES.put("AT", new Country("Austria", "AUT", "040");
// etcetera

Лично я бы добавил двухбуквенные коды в качестве дополнительного поля Country:

  • Избегает необходимости «обратного просмотра» для получения двухбуквенного кода.
  • Позволяет создавать вторичные хеш-таблицы;например, чтобы включить поиск по трехбуквенному коду страны. Например:

     Map<String, Country> map2 = new HashMap<>();
     for (Country country: map.values()) {
         map2.put(country.getAlpha(), country);
     }
    
     // That could also be written as:
     // Map<String, Country> map2 = map.values().stream()
     //      .collect(Collectors.toMap(Country::getAlpha, Function.identity())
    
     map2.get("AUT");
    

Это можно реализовать, используя Map<String, Map<String, String>>, но это более громоздко, менее эффективно и более хрупко 1 .


1 - Проблемы возникают, если в коде, который строит карты или обращается к нему, есть опечатка. Например, если вы пропустили «country» как «coumtry» в одной из записей карты, компилятор не поднимет ее, и вы получите неожиданный NPE.

2 голосов
/ 05 октября 2019

Вы можете написать свой собственный класс. (Конструктор + Getter / Setter также есть)

public class Country {
    private String country;
    private String alpha;
    private String number;
}

Для хранения ваших объектов нашего класса, вы можете использовать карту.

Map<String, Country> table = new HashMap<>();
table.put("AF", new Country("Afghanistan", "AFG", "004");
table.put("AT", new Country("Austria", "AUT", "040");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...