Java:HashMap:get:指定默认值

时间:2011-11-28 09:43:15

标签: java python dictionary hashmap hashtable

在Python中,我可以执行以下操作:

d = { 'a': True, 'b': False }
print d.get('x', True)

会打印

True

在Java中,HashMap.get方法没有用于指定默认值的第二个参数。实现这一目标的正确,简洁和可读的方法是什么?以下表达式对我来说似乎太多了:

map.containsKey("x") ? map.get("x") : true

8 个答案:

答案 0 :(得分:6)

OP编辑了他的问题,但我会留下答案以防万一。

你应该使用

map.containsKey("x") 

而不是

map.get("x") != null

测试map是否有key的映射。

地图可以在映射中包含null作为有效值。

python也是如此。仅测试dict [key] == None是否足以知道某个键是否映射到某个东西是不够的。

快速测试:

d = {'a': None}

# returns True
d['a'] == None

# raises KeyError
d['b'] 

# returns 'Whatever'
d.get('b', 'Whatever')

因此java等效于python dict.get()是

map.containsKey("x") ? map.get("x") : default_value

如OP所说

答案 1 :(得分:2)

我认为......

Object o = map.get("x");
if(o == null)
    o = BOOLEAN.TRUE;

...几乎是最可读和最有效的方法。你只是这样做一次地图查找。不幸的是,“Java”和“简洁”并不倾向于适用于同一句话,除非它是否定的。

答案 2 :(得分:1)

两者都是有效的解决方案(虽然引入一个局部变量可能会更好......性能更好)但是在代码中到处都这样做并不是一个好主意。考虑为HashMap编写一个适配器,为您提供一个允许您指定默认值的新get()方法。这是增强课程功能的最佳方式。

答案 3 :(得分:0)

map.get("x") == null ? true : map.get("x")

这听起来不错但是如果你需要它,你可以实现自己的实现来处理get() itlself

答案 4 :(得分:0)

我会扩展地图以显示get(String key, Boolean defaultValue) ...如果不是,我至少将三元组放入方法中,将get.("x")的结果推入堆栈,而不是获取它两次......像IfNull(map.get("x"), True)

如果你需要提供默认值,你可能无论如何都要对地图进行“专门”使用,因此我想包装类将是要走的路,不仅仅是为了这种行为,而是对于任何其他行为(当前和未来) )专门的行为/责任。

这就是我如何处理它...我不是面向对象的设计大师; - )

干杯。基思。

答案 5 :(得分:0)

两者都错了,因为他们会进行2次查找。 通常你会想做:

Boolean ret = map.get("x");
if (ret == null) {
    return true
}
return ret;

您可以将其包装在函数

public static <K,V> V mapGet(Map<K, V> map, K key, V defaultValue) {
    V ret = map.get(key);
    if (ret == null) {
        return defaultValue;
    }
    return ret;
}

如果需要,可以将其设为非静态。如果您是实例化地图对象的人(您没有从外部代码获取它),您可以继承hashmap。如果API返回map实例,那么您就不能使用子类化。

public class MyHashMap<K,V> extends HashMap<K,V> {
    public V get(K key, V default) {
        V ret = get(key);
        if (ret == null) {
            return defaultValue;
        }
        return ret;
    }
}

答案 6 :(得分:0)

一个简短且相当通用的方法,虽然不一定是好的做法,但它将是一个帮助类和一个静态导入:

Helper.java

package vlad;
import java.util.Map;
public class Helper{    
    public static <K,V> V get(Map<K,V> m, K key, V def){
        V v = m.get(key);
        return (v!=null) ? v : def;
    }
}

Test.java

import java.util.*;
import static vlad.Helper.get;

class Test{

    public static void main(String[]args){

        Map<String, Integer> m = new HashMap<String,Integer>();

        m.put("forty-two", 42);
        m.put("three", 3);
        m.put("one", 1);

        System.out.println(get(m,"forty-two",-1));
        System.out.println(get(m,"three",-1));
        System.out.println(get(m,"one",-1));
        System.out.println(get(m,"something_else",-1));

    }
}

答案 7 :(得分:0)

在Java 8中,Map上有一个getOrDefault方法,它应该像Python的dict s'get方法一样:https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#getOrDefault-java.lang.Object-V-