用Java在常量时间内合并两个列表
有谁知道是否可以在Java中定时合并两个列表(或任何集合)?
http://www.cppreference.com/wiki/stl/list/splice
在C中使用链接列表很容易
谢谢,
就我所知,JDK库中的类不支持这一点。
如果您构建自己的List
实现(您可以自由执行),那么这是完全合法的。 您可以使用LinkedList
并识别要添加的集合也是LinkedList
的特例。
在记录你的课程时,你需要指出添加的对象成为新对象的一部分,换句话说,失去了很多普遍性。 还有很多错误的可能性:在加入之后更改原始列表(如果它们是可变的)将允许您创建一个列表,其中有一个空格或两个尾部。 另外,大多数其他操作不会从您的黑客入侵课程中受益。 换句话说,乍一看,这似乎是一个疯狂的想法。
请注意,“合并”列表通常具有不同的内涵; 例如,当合并排序列表时,可以期望结果列表具有相同的排序。 你在谈论加入两个链接列表时真的更好地称为“拼接”。 或者也许只是“加入”。
你可以在多个List
的周围实现一个复合“包装器”。 为了简单起见,我使我的示例不可变,但是您始终可以实现add
以追加到存储在组合对象内的“最终” List
。
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.
}
您可以执行下一步:在此处获取Java源代码的LinkedList:LinkedList.java
然后在这个实现中添加下一个函数:
public void concatenate(LinkedList<E> list)
{
header.previous.next = list.header.next;
list.header.next.previous = header.previous;
list.header.previous.next = header.next;
header.next.previous = list.header.previous;
list.header.next = header.next;
header.previous = list.header.previous;
size = size + list.size;
modCount = modCount + list.modCount + 1;
list.size = size;
list.modCount = modCount;
}
使用这段代码,2 LinkedList将会是相同的LinkedList,所以你会合并成一个。 容器LinkedList将在末尾添加参数LinkedList,最后两个LinkedList的头将指向第一个和最后一个元素。 在这种方法中,我不在意这两个列表中的哪一个是空的,因此在使用它之前请确保您有两个元素列表,否则您必须检查并注意这一点。
测试1:
public static void main(String[] args)
{
LinkedList<String> test1 = new LinkedList<String>();
LinkedList<String> test2 = new LinkedList<String>();
test1.add("s1");
test1.add("s2");
test2.add("s4");
test2.add("s5");
test1.concatenate(test2);
System.out.println(test1);
System.out.println(test2);
}
出:
[s1, s2, s4, s5]
[s1, s2, s4, s5]
Test2性能:
public static void main(String[] args)
{
int count = 100000;
myutil.LinkedList<String> test1 = new myutil.LinkedListExt<>();
myutil.LinkedList<String> test2 = new myutil.LinkedListExt<>();
test1.add("s1");
test1.add("s2");
test2.add("s3");
test2.add("s4");
for (int i=0; i<count; ++i)
test2.add("s");
long start = System.nanoTime();
test1.concatenate(test2);
long elapsedTime = System.nanoTime() - start;
System.out.println(elapsedTime/1000000.0);
java.util.LinkedList<String> test3 = new java.util.LinkedList<>();
java.util.LinkedList<String> test4 = new java.util.LinkedList<>();
test3.add("s1");
test3.add("s2");
test4.add("s3");
test4.add("s4");
for (int i=0; i<count; ++i)
test4.add("s");
start = System.nanoTime();
test3.addAll(test4);
elapsedTime = System.nanoTime() - start;
System.out.println(elapsedTime/1000000.0);
}
出:
0.004016
10.508312
链接地址: http://www.djcxy.com/p/19953.html