C # на Java - словари? - PullRequest
       19

C # на Java - словари?

50 голосов
/ 31 июля 2011

Можно ли в Java создать словарь с уже объявленными элементами? Так же, как приведенный ниже код C #:

   Dictionary<string, int> d = new Dictionary<string, int>()
    {
        {"cat", 2},
        {"dog", 1},
        {"llama", 0},
        {"iguana", -1}
    };

Как мне это сделать и какой тип использовать? Я читал, что словарь устарел.

Ответы [ 5 ]

73 голосов
/ 31 июля 2011

Это будет делать то, что вы хотите:

Map<String,Integer> map = new HashMap<String, Integer>(){{
    put("cat", 2);
    put("dog", 1);
    put("llama", 0);
    put("iguana", -1);
}};

Этот оператор создает анонимный подкласс HashMap, где единственным отличием от родительского класса является то, что 4 записи добавляются во время создания экземпляра.Это довольно распространенная идиома в мире Java (хотя некоторые считают ее противоречивой, поскольку она создает новое определение класса).

Из-за этой противоречивости в Java 9 появилась новая идиома для удобного построения карт:семейство статических методов Map.of .

С Java 9 или выше вы можете создать нужную карту следующим образом:

Map<String, Integer> map = Map.of(
    "cat", 2,
    "dog", 1,
    "llama", 0,
    "iguana", -1
);

Для больших карт это альтернативный синтаксис может быть менее подвержен ошибкам:

Map<String, Integer> map = Map.ofEntries(
    Map.entry("cat", 2),
    Map.entry("dog", 1),
    Map.entry("llama", 0),
    Map.entry("iguana", -1)
);

(Это особенно удобно, если Map.entry статически импортируется вместо явной ссылки).

Кроме толькоПри работе с Java 9+ эти новые подходы не совсем эквивалентны предыдущему:

  • Они не позволяют указать, какая реализация Map используется
  • Они создают только неизменяемыекарты
  • Они не создают анонимный подкласс Map

Однако эти различия не должны иметь значения для многих случаев использования, что делает этот подход подходящим по умолчаниюh для более новых версий Java.

12 голосов
/ 31 июля 2011
Map<String,Integer> map = new HashMap<String, Integer>(){{
put("cat", 2);
put("dog", 1);
put("llama", 0);
put("iguana", -1);
}};
4 голосов
/ 31 июля 2011

Укуси пулю и набери название карты!

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("cat", 2);
    map.put("dog", 1);
    map.put("llama", 0);
    map.put("iguana", -1);

Вы также можете сделать что-то вроде этого, что может сэкономить набор текста с длинным списком:

    Object[][] values = {
        {"cat", 2},
        {"dog", 1},
        {"llama", 0},
        {"iguana", -1}
    };

    for (Object[] o : values) {
        map.put((String) o[0], (Integer) o[1]);
    }
3 голосов
/ 31 июля 2011

Если вы используете библиотеку Guava , вы можете использовать ее класс ImmutableMap, либо сам по себе (примеры 1 и 2), либо в качестве инициализатора для HashMap (примеры 3 и 4):

Map<String, Integer> map1 = ImmutableMap.<String, Integer> builder()
    .put("cat", 2)
    .put("dog", 1)
    .put("llama", 0)
    .put("iguana", -1)
    .build();
Map<String, Integer> map2 = ImmutableMap.of(
    "cat", 2,
    "dog", 1,
    "llama", 0,
    "iguana", -1
);
Map<String, Integer> map3 = Maps.newHashMap(
    ImmutableMap.<String, Integer> builder()
    .put("cat", 2)
    .put("dog", 1)
    .put("llama", 0)
    .put("iguana", -1)
    .build()
);
Map<String, Integer> map4 = Maps.newHashMap( ImmutableMap.of(
    "cat", 2,
    "dog", 1,
    "llama", 0,
    "iguana", -1)
);
0 голосов
/ 31 июля 2011

Java7 почти ввел «литералы коллекции», которые допускают такой синтаксис.Вероятно, они попытаются запихнуть это в Java8.Я понятия не имею, что не так с этими людьми.

Это может быть легко достигнуто с помощью какого-то API-интерфейса оболочки

Map<String,Integer> map = Maps.<String,Integer>empty()
    .put("cat", 2).put("dog",1)....; 

Не так уж плохо.Я бы предпочел что-то вроде

map("cat", "dog", ... )
.to(  1,     2,   ... );

Подобные вещи должны были реализовываться разными людьми, к сожалению, стандартный API не поддерживает такие вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...