Существует ли Java, эквивалентный из defaultdict Python?

В Python, defaultdict класс обеспечивает удобный способ создать отображение из key -> [list of values], в следующем примере,

from collections import defaultdict
d = defaultdict(list)
d[1].append(2)
d[1].append(3)
# d is now {1: [2, 3]}

Существует ли эквивалент этому в Java?

40
задан garg10may 20 October 2019 в 21:38
поделиться

4 ответа

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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class DefaultDict<K, V> extends HashMap<K, V> {

    Class<V> klass;
    public DefaultDict(Class klass) {
        this.klass = klass;    
    }

    @Override
    public V get(Object key) {
        V returnValue = super.get(key);
        if (returnValue == null) {
            try {
                returnValue = klass.newInstance();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            this.put((K) key, returnValue);
        }
        return returnValue;
    }    
}

Этот класс можно использовать, как показано ниже:

public static void main(String[] args) {
    DefaultDict<Integer, List<Integer>> dict =
        new DefaultDict<Integer, List<Integer>>(ArrayList.class);
    dict.get(1).add(2);
    dict.get(1).add(3);
    System.out.println(dict);
}

Этот код будет печатать: {1 = [2, 3]}

25
ответ дан 27 November 2019 в 01:50
поделиться

в дополнение к коллекциям apache, проверьте также коллекции google :

Коллекция, аналогичная Map, но которая может связывать несколько значений с одним ключом. Если вы вызываете put (K, V) дважды, с одним и тем же ключом, но с разными значениями, multimap будет содержать сопоставления ключа с обоими значениями.

8
ответ дан 27 November 2019 в 01:50
поделиться

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

1
ответ дан 27 November 2019 в 01:51
поделиться

Вы можете использовать MultiMap из Apache Commons .

6
ответ дан 27 November 2019 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: