我需要将[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
映射到HashMap
到List<Integer>
的另一个Integer
的映射。 [类似于接受的答案here]
第四种方法:创建一个以Integer
和List<Integer>
为字段的对象,并覆盖equals
和hashCode
方法。这将成为关键。
我觉得第三种方法是最简单的,并且会产生最易读的代码。我正在努力权衡所有4种设计的优缺点。速度是关键。
这是关于Google Foobar挑战[problem]
的问题答案 0 :(得分:0)
我赞成使用自定义类,通过使用IDE生成getter,setter,equals
,hashCode
和toString()
方法,可以使其更具可读性。
注意:使用HashMap而不是对象会产生更高的开销,并使您的程序以后更难以分析。