HashMap为未find的键返回默认值?
有没有可能有一个HashMap
返回一个默认值的所有密钥是不是在该集合中find?
没有Map的实现可以做到这一点,但是通过扩展HashMap实现你自己的实现将是微不足道的:
public class DefaultHashMap<K,V> extends HashMap<K,V> { protected V defaultValue; public DefaultHashMap(V defaultValue) { this.defaultValue = defaultValue; } @Override public V get(Object k) { return containsKey(k) ? super.get(k) : defaultValue; } }
在Java 8中,使用Map.getOrDefault 。 如果找不到匹配关键字,则返回键值和返回值。
如果你不喜欢重新发明轮子,使用Commons的DefaultedMap ,
Map<String, String> map = new DefaultedMap<>("[NO ENTRY FOUND]"); String surname = map.get("Surname"); // surname == "[NO ENTRY FOUND]"
如果您不负责创build地图,也可以传入现有的地图。
Java 8为Map
接口引入了一个不错的computeIfAbsent默认方法,它存储了懒计算值,所以不会中断地图合同:
Map<Key, Graph> map = new HashMap<>(); map.computeIfAbsent(aKey, key -> createExpensiveGraph(key));
原产地: http : //blog.javabien.net/2014/02/20/loadingcache-in-java-8-without-guava/
免责声明:这个答案与OP所要求的完全不一致,但是在某些情况下,如果密码数量有限,不同值的caching将会有利可图,在某些情况下可能会很方便。 它不应该使用相反的情况下,大量的键和相同的默认值,这将不必要地浪费内存。
您可以简单地创build一个inheritanceHashMap并添加getDefault方法的新类。 这是一个示例代码:
public class DefaultHashMap<K,V> extends HashMap<K,V> { public V getDefault(K key, V defaultValue) { if (containsKey(key)) { return get(key); } return defaultValue; } }
我认为你不应该在你的实现中重写get(K key)方法,因为Ed Staub在他的评论中指定的原因,因为你将打破Map接口的合约 (这可能会导致一些难以发现错误)。
难道你不能只是创build一个静态方法,完全是这样吗?
private static <K, V> V getOrDefault(Map<K,V> map, K key, V defaultValue) { return map.containsKey(key) ? map.get(key) : defaultValue; }
它默认是这样做的。 它返回null
。
不是直接的,但是你可以扩展这个类来修改它的get方法。 下面是一个可以使用的示例: http : //www.java2s.com/Code/Java/Collections-Data-Structure/ExtendedVersionofjavautilHashMapthatprovidesanextendedgetmethodaccpetingadefaultvalue.htm
/** * Extension of TreeMap to provide default value getter/creator. * * NOTE: This class performs no null key or value checking. * * @author N David Brown * * @param <K> Key type * @param <V> Value type */ public abstract class Hash<K, V> extends TreeMap<K, V> { 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); }
用法示例:
protected class HashList extends Hash<String, ArrayList<String>> { private static final long serialVersionUID = 6658900478219817746L; @Override public ArrayList<Short> create(Short key) { return new ArrayList<Short>(); } } final HashList haystack = new HashList(); final String needle = "hide and"; haystack.getOrCreate(needle).add("seek") System.out.println(haystack.get(needle).get(0));
我需要阅读从JSON服务器返回的结果,我不能保证字段将存在。 我使用从HashMap派生的类org.json.simple.JSONObject。 以下是我所采用的一些帮手function:
public static String getString( final JSONObject response, final String key ) { return getString( response, key, "" ); } public static String getString( final JSONObject response, final String key, final String defVal ) { return response.containsKey( key ) ? (String)response.get( key ) : defVal; } public static long getLong( final JSONObject response, final String key ) { return getLong( response, key, 0 ); } public static long getLong( final JSONObject response, final String key, final long defVal ) { return response.containsKey( key ) ? (long)response.get( key ) : defVal; } public static float getFloat( final JSONObject response, final String key ) { return getFloat( response, key, 0.0f ); } public static float getFloat( final JSONObject response, final String key, final float defVal ) { return response.containsKey( key ) ? (float)response.get( key ) : defVal; } public static List<JSONObject> getList( final JSONObject response, final String key ) { return getList( response, key, new ArrayList<JSONObject>() ); } public static List<JSONObject> getList( final JSONObject response, final String key, final List<JSONObject> defVal ) { try { return response.containsKey( key ) ? (List<JSONObject>) response.get( key ) : defVal; } catch( ClassCastException e ) { return defVal; } }