HashMap的自定义键

时间:2016-03-14 06:11:56

标签: java dictionary hashmap

我需要将[Integer, List<Integer>]键映射到Integer。考虑到速度是关键,我已经考虑了以下方法并且正在努力确定哪个是最有益的。

为什么我需要这个?

有一个2D数组。每行是从站出来的行数。每行包含来自地铁的线。因此,地铁站的编号为0,1 ......所有行都具有相同数量的元素(源自所有站的行数相同)。第0行的第0个索引给出了第0行的目标。第1行的第1个索引给出了第1行的目的地,...站k的列表的第r个元素,通过从站k获取行r,可以直接到达站。现在,假设你在其中一个站丢失了。与您所在的站点无关,如果您采用某种路径组合,您将到达一个公共站点。这称为会议路径。我需要找到,对于给定的地铁配置,是否有可能的会议路径。例如。对于subway = [[2, 1], [2, 0], [3, 1], [1, 0]],从任何电台获取line1然后从line0开始,导致在station2结束。所以[1,0]将是一个会议路径。 我已经生成了一组路径,看起来像[[0],[1],[0,0],[0,1],[1,0],[1,1],[0,0, 0],[0,0,1],...]。我必须遍历每个站的路径,看看我是否最终在所有站的同一站。说,我们考虑station0,并考虑路径[0,0,1]。我已经遍历了路径[0,0]。不再遍历那部分,我可以使用遍历[0,0]之后的任何结果并从该点获取line1,最终到达我的新目的地。这就是我需要缓存([startStation,pathList],destination)的原因。此外,如果这种搜索会议路径的方式对于8度路径不起作用,我们需要检查关闭某个站是否会导致会议路径。更重要的是,我为什么要使用[startStation,pathList]作为键。链接到完整的问题陈述是在帖子的最后。

第一种方法:创建一个新的unmodifiableList,其第0个索引的值为上述Integer,其余为List<Integer>。我会用这个unmodifiableList作为关键。

第二种方法:创建一个新的unmodifiableList,其中第0个索引的值为上述Integer,第一个索引为List<Integer>的不可修改副本的hashCode。我会用这个unmodifiableList作为关键。 [Thilo在评论中正确地指出这种方法会导致碰撞]。

第三种方法:[嵌套地图]创建从Integer映射到HashMapList<Integer>的另一个Integer的映射。 [类似于接受的答案here]

第四种方法:创建一个以IntegerList<Integer>为字段的对象,并覆盖equalshashCode方法。这将成为关键。

我觉得第三种方法是最简单的,并且会产生最易读的代码。我正在努力权衡所有4种设计的优缺点。速度是关键。

这是关于Google Foobar挑战[problem]

的问题

1 个答案:

答案 0 :(得分:0)

我赞成使用自定义类,通过使用IDE生成getter,setter,equalshashCodetoString()方法,可以使其更具可读性。

注意:使用HashMap而不是对象会产生更高的开销,并使您的程序以后更难以分析。