C # беженец ищет немного помощи коллекций Java - PullRequest
8 голосов
/ 23 июня 2009

Мне нужно хранить информацию о ключе / значении в какой-либо коллекции. В 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, но я хотел бы, чтобы решение с обобщениями, если это возможно.

Ответы [ 6 ]

22 голосов
/ 23 июня 2009

Вы хотите использовать 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 в данном случае

7 голосов
/ 23 июня 2009

Используйте 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 Collections . Это отлично.

6 голосов
/ 23 июня 2009

Вы используете 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;
    ...
}
2 голосов
/ 23 июня 2009

Похоже, вы ищете что-то вроде HashMap

1 голос
/ 23 июня 2009
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("Stop Me", 11);
map.put("Feed Me", 12);
map.put("Walk Me", 13);
Integer x; // little hack
int value = (x = a.get("aaa")) == null? 0 : x;

в качестве альтернативы вы можете попробовать Enum:

enum Action {

    STOP(11),
    FEED(12),
    WALK(13);

    private final int value;

    private Action(int value) {
        this.value = value;
    }

    public int value() {
        return value;
    }

    public static Action valueOf(int value) {
        for (Action action : values()) {
            if (action.value == value) {
                return action;
            }
        }

        return null; // or a null-object
    }
}

тест:

public void action() {
    Action action = Action.valueOf("FEED"); 
    // or Action.FEED for more compile-time safety
    int value = action.value();
    // instantiating by code 
    Action walk = Action.valueOf(13);
}
1 голос
/ 23 июня 2009

Вы определенно хотите HashMap, который является Java-версией C # Dictionary.

...