Search code examples
javapythonhashmap

Is there a Java equivalent of Python's defaultdict?


In Python, the defaultdict class provides a convenient way to create a mapping from key -> [list of values], in the following example,

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

Is there an equivalent to this in Java?


Solution

  • There is nothing that gives the behaviour of default dict out of the box. However creating your own default dict in Java would not be that difficult.

    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;
        }    
    }
    

    This class could be used like below:

    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);
    }
    

    This code would print: {1=[2, 3]}