在 Java 中以恒定时间合并两个列表

2022-09-04 20:29:32

有谁知道是否可以在Java中以恒定时间合并两个列表(或任何集合)?

http://www.cppreference.com/wiki/stl/list/splice

在C中使用链接列表很容易做到这一点...

谢谢


答案 1

据我所知,JDK库中的类不支持此功能。

如果你构建自己的实现是可能的 - 你可以自由地做,这是完全合法的。您可以使用 s 并识别要添加的集合也是 .ListLinkedListLinkedList

在记录类时,您需要指出添加的对象将成为新对象的一部分,换句话说,许多通用性都丢失了。还有很多潜在的错误:在加入后更改原始列表(如果它们是可变的)将允许您创建一个具有间隙或具有两个尾部的列表。此外,大多数其他操作也不会从您被黑客入侵的类中受益。换句话说,乍一看,这似乎是一个疯狂的想法。

请注意,“合并”列表通常具有不同的含义;例如,在合并排序列表时,人们会期望生成的列表具有相同的顺序。你所谈论的加入两个链接列表实际上更好地称为“拼接”。或者只是“加入”。


答案 2

您可以围绕多个 s 实现复合“包装器”。为简单起见,我使我的示例不可变,但您始终可以实现附加到存储在复合对象中的“final”。ListaddList

public class CompositeImmutableList<T> implements List<T> {
  private final List<T> l1;
  private final List<T> l2;

  public CompositeImmutableList(List<T> l1, List<T> l2) {
    this.l1 = l1;
    this.l2 = l2;
  }

  public boolean add(T t) {
    throw new UnsupportedOperationException();
  }

  public int size() {
    return l1.size() + l2.size();
  }

  public T get(int i) {
    int sz1 = l1.size();
    return i < s1 : l1.get(i) : l2.get(sz1 - i);
  }

  // TODO: Implement remaining List API methods.
}