Подтвердить что ты не робот

С# на Java - Словари?

Возможно ли в Java сделать словарь с уже объявленными в нем элементами? Как и ниже код С#:

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

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

4b9b3361

Ответ 1

Это сделает то, что вы хотите:

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

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

Ответ 2

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

Ответ 3

Укусите пулю и введите имя карты!

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

Ответ 4

Если вы используете библиотеку 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)
);

Ответ 5

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

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

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

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

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

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