有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

HashMap的java自定义键

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

为什么我需要这个

有一个二维数组。每行是出站的线路数。每一行包含源自地铁的线路。所以,地铁站的编号是0,1,。。。所有行具有相同数量的元素(来自所有桩号的线数量相同)。行的第0个索引给出了第0行的目的地。行的第1个索引给出了第1行的目的地,。。。车站k列表中的rth元素表示从车站k乘r线可直接到达车站。现在,假设您在其中一个车站迷路。不管你在哪一站,如果你走某种路径组合,你将到达一个公共的车站。这称为会议路径。我需要找出,对于给定的地铁配置,是否有可能的会议路径。例如,对于subway = [[2, 1], [2, 0], [3, 1], [1, 0]],从任何一个站点先取第1行,然后取第0行,结果是在站点2结束。因此[1,0]将是一个会议路径。 我已经生成了一组路径,看起来像[[0],[1],[0,0],[0,1],[1,0],[1,1],[0,0,0],[0,0,1],…]。我必须从每一个车站穿过这条路,看看我是否在所有车站的同一个车站结束。比如,我们考虑PANT0,并且考虑路径[0,01]。我已经穿过了路径[0,0]。我可以使用遍历[0,0]后得到的任何结果,从该点获取line1,以到达新的目的地,而不是再次遍历该部分。这就是为什么我需要缓存([startStation,pathList],destination)。此外,如果这种搜索会议路径的方法不适用于8度的路径,我们需要检查关闭某个站点是否会导致会议路径。更重要的是,为什么我想使用[startStation,pathList]作为键。完整问题陈述的链接在文章的末尾

第一种方法:创建一个新的unmodifiableList,第0个索引处的值作为前面提到的Integer,其余的值作为List<Integer>。我会用这个unmodifiableList作为键

第二种方法:创建一个新的unmodifiableList,第0个索引处的值作为前面提到的Integer,第1个索引作为List<Integer>的不可修改副本的哈希代码。我会用这个unmodifiableList作为键。[Thilo在评论中正确指出,这种方法会导致冲突]

第三种方法:[嵌套映射]创建从一个Integer到另一个HashMap的映射,该映射从List<Integer>映射到Integer。[与公认的答案类似here]

第四种方法:使用IntegerList<Integer>作为字段创建对象,并重写equalshashCode方法。这将成为关键

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

这是关于谷歌Foobar挑战赛的一个问题


共 (1) 个答案

  1. # 1 楼答案

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

    注意:使用HashMap而不是对象会带来更高的开销,并且使您的程序更难在以后分析