Беженец из C# просит помощи в создании коллекций Java
-
06-07-2019 - |
Вопрос
Мне нужно сохранить информацию о ключе/значении в коллекции определенного типа.В C# я бы определил словарь следующим образом:
var entries = new Dictionary<string, int>();
entries.Add("Stop me", 11);
entries.Add("Feed me", 12);
entries.Add("Walk me", 13);
Тогда я бы получил доступ к значениям так:
int value = entries["Stop me"];
Как мне это сделать на Java?Я видел примеры с ArrayList
, но мне бы хотелось получить решение с использованием дженериков, если это возможно.
Решение
Вы хотите использовать Map
Map<String, Integer> m = new HashMap<String, Integer>();
m.put("Stop me", 11);
Integer i = m.get("Stop me"); // i == 11
Обратите внимание, что в последней строке я мог бы сказать:
int i = m.get("Stop me");
Что является сокращением для (с автоматической распаковкой Java):
int i = m.get("Stop me").intValue()
Если на карте нет указанного значения для данного ключа, get
возвращает null
и это выражение выдает NullPointerException
. Следовательно, в этом случае всегда рекомендуется использовать коробочный тип Integer
Другие советы
Использовать java.util.Map
.Существует несколько реализаций:
HashMap
:Поиск O (1), не поддерживает порядок ключейTreeMap
:Поиск O(log n) поддерживает порядок ключей, поэтому вы можете перебирать их в гарантированном порядке.LinkedHashMap
:Поиск O(1) перебирает ключи в том порядке, в котором они были добавлены на карту.
Вы используете их как:
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Stop me", 11);
map.put("Feed me", 12);
int value = map.get("Stop me");
Для дополнительного удобства работы с коллекциями взгляните на Библиотека коллекций Google.Это превосходно.
Вы используете Map
на Java.
Обратите внимание, что вы не можете использовать int
(или любой другой тип примитива) в качестве параметра универсального типа, но из-за автобокса он по-прежнему ведет себя почти , как если бы он был Map<String, int>
вместо Map<String, Integer>
. (Вы не хотите делать много автобоксов в чувствительном к производительности коде.)
Map<String, Integer> entries = new HashMap<String, Integer>();
entries.put("Stop me", 11);
entries.put("Feed me", 12);
entries.put("Walk me", 13);
int value = entries.get("Stop me"); // if you know it exists
// If you're not sure whether the map contains a value, it's better to do:
Integer boxedValue = entries.get("Punch me");
if (boxedValue != null) {
int unboxedValue = boxedValue;
...
}
Вам определенно требуется HashMap
, то есть Java-версия C # Dictionary
.