Collections中的哪个数据结构可以有效地存储键值映射,保留插入顺序并允许高效反向遍历?数据结构必须来自原始Java集合,因此使用Apache Commons库是不可能的。
我目前正在使用LinkedHashMap,这是理想的,因为它保留了插入顺序,允许键值映射,并且具有在O(1)时间内运行的add()和remove()方法。但问题是,为了反转LinkedHashMap,我需要在每次添加新密钥时执行set-copy:
List<Integer> reverseKeys = new ArrayList<>(keys);
Collections.reverse(reverseKeys);
对于大型密钥集而言变得非常昂贵(如此处所述:Iterating through a LinkedHashMap in reverse order)。
或者,我可以使用带有自定义比较器的TreeMap来保留插入顺序,但这似乎是浪费,因为add()和remove()将在O(n)时间内运行。这种方法的好处是TreeMap具有descendingKeySet()方法,该方法允许有效的反向遍历。
我唯一的另一个想法是使用Entry对象的ArrayList,但是我不确定它会有多高效。
这些方法中的哪一种在几千个键值映射中表现最佳?有没有我没有列出的方法会更好?
答案 0 :(得分:2)
你只需要一个变量吗?如果您想经常查询,那么在不同结构中多次使用相同数据是常见的方法。
添加/删除成本更高,但选择的成本会低很多。
在您的情况下,您可以按相反顺序使用LinkedList(在零位置添加O(1))和LinkedHashMap。
理想情况下,您应该使用这两个变量和方法创建自己的类,例如“添加/删除等”,以确保它是一致的。