使用默认值初始化HashMap?

时间:2016-02-27 01:57:21

标签: java

我正在实现此处给出的A *搜索算法,https://en.wikipedia.org/wiki/A * _ search_algorithm

此行表示我们需要使用默认值INFINITY

初始化地图
gScore := map with default value of Infinity

所以我在这里尝试过,

Map<State, Double> gScore = new HashMap<State, Double>(Double.POSITIVE_INFINITY);

这不起作用,但以下情况;

Map<State, Double> gScore = new HashMap<State, Double>((int) Double.POSITIVE_INFINITY);

我想知道为什么以及它对我的实施会产生什么影响(如果有的话)。

3 个答案:

答案 0 :(得分:1)

无法使用Java中的默认值初始化地图,而第二个版本不会创建默认值为infinity的地图,而是尝试创建无限大的地图。 (不是真的,但它会尽可能地创建最大的地图。)

相反,修改算法:随时执行map.get(key),检查值是否为空,如果是,则将其替换为无穷大。

答案 1 :(得分:1)

我同意@Louis,最佳解决方案是检查get调用的结果,看看它是否为null

但是,可能创建HashMap的子类,并使用get方法的覆盖,如果super.get(key)返回{null,则返回默认值{1}}。但要小心异常; e.g。

  • 迭代地图只会为您提供“真正存在”的条目。

  • 如果存在null值的真实条目(因为您致电put(key, null)),则在致电null时,您将无法获得get条目密钥。但是条目显示在迭代中......值为null

因此,从OO设计的角度来看,更好的方法(扩展HashMap)将创建一个特定于应用程序的类,它只公开Map功能的一个子集。

答案 2 :(得分:1)

您可以使用Double.POSITIVE_INFINITY,而不是明确地将putIfAbsent用于所有可能的键(可能效率低下)。

在你所拥有的任何地方:

value = map.get(key);

您可以将其更改为:

value = map.putIfAbsent(key,Double.POSITIVE_INFINITY);

这将表现为Map(或当前值为null的任何键)中不存在的任何键的值为Double.POSITIVE_INFINITY。对于任何此类密钥,它会将值Double.POSITIVE_INFINITY放在Map中。

这样可以避免检查map.get(key)是否返回null