Есть ли мультикарта с разными типами значений - PullRequest
0 голосов
/ 07 мая 2019

Моему приложению требуется многозначная карта с ключом, имеющим 2 типа значений, например, List и String. Карта может возвращать все значения или одно значение на основе параметра типа, как в get (ключ, тип).

Не удалось найти такую ​​функцию в многозначной карте Spring или Apache. Есть ли какая-либо другая библиотека, предоставляющая эту структуру данных, или мне придется реализовать свою собственную?

Ответы [ 3 ]

0 голосов
/ 07 мая 2019

Легко добавить мультикарту в Java 8 с выражением lamda с различными значениями, как и ожидалось. Вот пример кода. Вы можете попробовать.

public class TestMultiMap<K, V> {

    private final Map<K, Set<V>> multiValueMap = new HashMap<>();

    public void put(K key, V value) {
        this.multiValueMap.computeIfAbsent(key, k -> new HashSet<>()).add(value);
    }   
    public Set<V> get(K key) {
        return this.multiValueMap.getOrDefault(key, Collections.emptySet());
    }
}

Метод computeIfAbsent () принимает ключ и лямбду. Если этот ключ не существует, запускается computeIfAbsent () и создается новый HashMap.

Метод getOrDefault () возвращает значение или возвращает пустой набор, если ключ найден как нулевой.

Чтобы использовать это

TestMultiMap<String,Object> testMultiMap = new TestMultiMap<>();
testMultiMap.put("Key 1", new Object());
testMultiMap.put("Key 2", "String 1");
testMultiMap.put("Key 3", 1);
0 голосов
/ 07 мая 2019

Как насчет:

Map<String, Map<Class<?>, Object>> valuesByTypeByKey;

При получении укажите key и type:

public <T> T fetch(String key, Class<T> type) {
    return (T)valuesByTypeByKey.getOrDefault(key, Collections.emptyMap()).get(type);
}

Вставка работает так:

public <T> void insert(String key, Class<T> type, T value) {
    valuesByTypeByKey.computeIfAbsent(key, k -> new HashMap<>()).put(type, value);
}
0 голосов
/ 07 мая 2019

Создайте свой собственный объект

public class YourOwnObject {

    private HashMap<String,String> valuesMap
    private ArrayList<String> valuesList;

}

и когда вы создаете экземпляр своей карты:

Map<String,YourOwnObject>

Вы можете свободно делать все, если вы идете этим путем

...