HashMap to return default value for non-found keys?

后端 未结 14 2202
别跟我提以往
别跟我提以往 2020-11-27 14:05

Is it possible to have a HashMap return a default value for all keys that are not found in the set?

14条回答
  •  萌比男神i
    2020-11-27 14:08

    /**
     * Extension of TreeMap to provide default value getter/creator.
     * 
     * NOTE: This class performs no null key or value checking.
     * 
     * @author N David Brown
     *
     * @param    Key type
     * @param    Value type
     */
    public abstract class Hash extends TreeMap {
    
        private static final long serialVersionUID = 1905150272531272505L;
    
        /**
         * Same as {@link #get(Object)} but first stores result of
         * {@link #create(Object)} under given key if key doesn't exist.
         * 
         * @param k
         * @return
         */
        public V getOrCreate(final K k) {
            V v = get(k);
            if (v == null) {
                v = create(k);
                put(k, v);
            }
            return v;
        }
    
        /**
         * Same as {@link #get(Object)} but returns specified default value
         * if key doesn't exist. Note that default value isn't automatically
         * stored under the given key.
         * 
         * @param k
         * @param _default
         * @return
         */
        public V getDefault(final K k, final V _default) {
            V v = get(k);
            return v == null ? _default : v;
        }
    
        /**
         * Creates a default value for the specified key.
         * 
         * @param k
         * @return
         */
        abstract protected V create(final K k);
    }
    

    Example Usage:

    protected class HashList extends Hash> {
        private static final long serialVersionUID = 6658900478219817746L;
    
        @Override
            public ArrayList create(Short key) {
                return new ArrayList();
            }
    }
    
    final HashList haystack = new HashList();
    final String needle = "hide and";
    haystack.getOrCreate(needle).add("seek")
    System.out.println(haystack.get(needle).get(0));
    

提交回复
热议问题