Как сохранить много значений одним ключом

Я хочу сохранить 3 значения в 1 ключе. Hashmap может содержать только 1 ключ, 1 значение, поэтому его нельзя использовать. Итак, какими еще способами я могу получить от одного ключа значение A / B / C.

Ключ: строка

Значения: String / String / int


person user1621988    schedule 10.09.2012    source источник
comment
Существуют также (нестандартные API) реализации MultiMap .. (не то, что я рекомендую здесь из-за потери ввода при записи, но кое-что нужно иметь в виду)   -  person    schedule 10.09.2012
comment
Я действительно новичок в HashMaps / Maps / Lists. Поэтому довольно сложно понять обсуждаемые вами решения. Я пытаюсь понять и изучить этот пример. Но я не могу найти решение. так что если есть полный рабочий пример. Я могу извлечь уроки из этого и работать оттуда.   -  person user1621988    schedule 10.09.2012


Ответы (4)


Создайте объект для хранения ваших 3 значений, а затем новый объект будет вашим значением в паре «ключ-значение».

Вот пример реализации:

class TripleValue {
    String A;
    String B;
    int C;

    public TripleValue(String a, String b, int c) {
        A = a;
        B = b;
        C = c;
    }
}

public static void main() {
    Map<String, TripleValue> myMap = new HashMap<String, TripleValue>(); 
    myMap.put("SomeKey", new TripleValue("String1", "String2", 10));

}
person Ian Dallas    schedule 10.09.2012
comment
Если список значений динамический, это решение может быть не изящным. - person kosa; 10.09.2012
comment
@Nambari True, но OP перечисляет значения как String / String / int - person Ian Dallas; 10.09.2012
comment
Большое спасибо. Только один вопрос. как я могу вернуть значения TripleValue? Я попробовал итератор, но это не сработало. Код: для (Entry ‹String, TripleValue› entry: myMap.entrySet ()) {System.out.println (entry.getValue ()); } - person user1621988; 11.09.2012
comment
Вам нужно изменить его на это: System.out.println(entry.getValue().A). getValue () просто возвращает объект TripleValue. Затем вам нужно получить доступ к свойствам разницы в объекте TripleValue. - person Ian Dallas; 11.09.2012
comment
Большое спасибо, теперь это работает, и я узнал кое-что новое :) - person user1621988; 11.09.2012
comment
Рад помочь. Не стесняйтесь принять ответ, если считаете его приемлемым и полезным :) - person Ian Dallas; 11.09.2012

Одним из способов может быть использование ArrayList / Set в качестве значения для ключа.

Пример:

List myTempList = new ArrayList();
myTempList.add("Hi");
myTempList.add("Hello");
myTempList.add("How are you");

myMap.key("key", myTempList);

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

person kosa    schedule 10.09.2012
comment
Использование разнородного List, которое всегда будет содержать 3 элемента, вероятно, не лучшая идея. - person obataku; 10.09.2012
comment
@oldrinb: Да, я понимаю, что ценности не предопределены, если они есть, я согласен с вашим утверждением. Обновленный ответ с другим возможным решением. - person kosa; 10.09.2012

Платформа Java не поддерживает Multimap, есть способ обойти это, см. Ниже.

Map<Object,ArrayList<Object>> multiMap = new HashMap<Object,ArrayList<Object>>();

Также взгляните на эту библиотеку Guava-библиотеки

person Martyn Jones    schedule 10.09.2012

Пытаться

Map<Integer, List<yourObject>> m = new HashMap<>();

Затем вам нужно будет проверить, присутствует ли список для ключа. если да, то добавьте в список. Иначе создайте ArrayList и добавьте его

Например:

public add(String key, MyObj myobj){
    if (this.contains(key) ) { 
        this.get(key).add(myObj);
    }else {
        List<MyObject> list = new ArrayList<MyObject>();
        list.add(myObj);
        m.put(key, list);
    }
}
person RNJ    schedule 10.09.2012
comment
Вам не хватает > после объявленного типа m. Кроме того, начиная с Java 7, вы можете разрешить компилятору определять параметризованный тип созданного HashMap, т.е. new HashMap<>() - person obataku; 10.09.2012
comment
да хороший момент @oldrib. Я всегда забываю алмазного оператора! - person RNJ; 10.09.2012
comment
@oldrinb, что вы имеете в виду: выведите параметризованный тип созданного HashMap - как будет выглядеть код, использующий эту функцию? - person nuala; 11.09.2012
comment
@yoshi найдите алмазного оператора. Ответ имеет ‹› в конце объявления HashMap, в котором используется алмазный оператор. - person RNJ; 11.09.2012