将LinkedHashSet转换为List

时间:2011-05-19 15:44:01

标签: java algorithm list

  • 假设列表b是LinkedList。
  • 假设列表a也是一个LinkedList。

问题:

  • 如何在固定时间内附加这些列表?

有可能,因为LinkedList可能是一个双向链表(否则它无法实现Deque接口)。并且附加双向链表是0(1)操作。

addAll方法不会在固定时间内运行。

问题:

  • 如何在固定时间内将LinkedHashSet转换为列表?

这也可能是因为LinkedHashSet“维护了一个贯穿其所有条目的双向链表”。

3 个答案:

答案 0 :(得分:6)

您需要实现自己的类。 LinkedList类不公开其内部节点结构,因此您不能将其最后一个节点指向另一个LinkedList的第一个节点。

LinkedHashSet的答案类似:虽然它确实维护了这个双向链接列表,但您无法访问它。

答案 1 :(得分:6)

你的假设是基于没有封装 - 即LinkedHashSet愿意将其内部LinkedList暴露给外界,当我怀疑它不是。

同样加入两个链接列表 - 我不知道每个节点是否知道它所在的列表,但这肯定会破坏你的固定时间附加。即使他们不这样做,只要你将一个列表的头部连接到另一个列表的尾部,你就会遇到问题 - 你有两个列表都指向相同的数据,这会产生一些奇怪的后果。

换句话说,这两种操作在计算机科学意义上都是可行的,你可以构建你的自己的实现来支持它们,但这并不意味着Java API暴露了它的内部结构。一种支持这些操作的方法。

答案 2 :(得分:1)

你无法访问它,但我怀疑Collections确实如此,所以你不应该放弃希望这是一个可行且快速解决问题的方法。

我看得更远,你说得对。如果你有Set<Whatever> whatever = SOME CONSTRUCTOR,那么你可以编码List<Whatever> list = new LinkedList(whatever);,因为LinkedList有一个Collections构造函数,而Set有一个Collections接口。