我正在实现此处给出的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);
我想知道为什么以及它对我的实施会产生什么影响(如果有的话)。
答案 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
。