Java 集合/列表之间的循环和操作
我很难给这篇文章起个名字。 基本上,我有两套:我们称之为Java 集合/列表之间的循环和操作,java,set,iteration,Java,Set,Iteration,我很难给这篇文章起个名字。 基本上,我有两套:我们称之为A和B 我想执行以下操作(\代表除外): 我的第一次成功尝试是: // B and A are lists List<T> C = new LinkedList<>(A); C.removeAll(B); for (T other : C) operationX(other); List<T> D = new LinkedList<>(B); D.removeAll(A); for
A
和B
我想执行以下操作(\
代表除外):
我的第一次成功尝试是:
// B and A are lists
List<T> C = new LinkedList<>(A);
C.removeAll(B);
for (T other : C)
operationX(other);
List<T> D = new LinkedList<>(B);
D.removeAll(A);
for (T other : D)
operationY(other);
for (T other : B)
operationZ(other);
//B和A是列表
列表C=新链接列表(A);
C.removeAll(B);
对于(T其他:C)
操作X(其他);
列表D=新的链接列表(B);
D.removeAll(A);
对于(T其他:D)
操作(其他);
对于(T其他:B)
操作Z(其他);
但这似乎太慢了。这个函数应该每秒调用数百次,这些集合可以包含数百个对象
实现这一点的有效方法是什么?如果您只是计划迭代它,那么根本不需要创建
C
。您只需过滤掉A
中包含在B
中的每个元素,然后对每个过滤后的元素调用operationX
:
Set<T> bSet = new HashSet<>(B);
A.stream()
.filter(a -> !bSet.contains(a))
.forEach(this::operationX);
如果operationY
只需要为B
中的每个元素调用一次,即使存在重复项,我建议使用以下代码:
bSet.removeAll(A);
bSet.forEach(this::operationY);
B.forEach(this::operationZ);
要计算C=A\B,您可以首先从B构建一个哈希集,然后迭代A,并将所有元素添加到最初为空的集C中,这些元素不在哈希集中
此外,如果您经常在大型列表上进行迭代,则应尽可能使用ArrayList而不是LinkedList,因为在大型链表上进行迭代非常慢,因为会发生许多缓存未命中。您是否确实尝试使用集合?LinkedList是最慢的集合。这里也不需要复制。我还将使用在第一个集合上迭代的流进行测试,并过滤掉属于第二个集合的元素。我会将其与您的方法进行比较,但是使用HashSet或ArrayList。当然,如果集合从未更改,您应该存储这两个差异并重新使用它们。@JBNizet它们当然会不断更改。
Set<T> aSet = new HashSet<>(A);
B.stream()
.filter(b -> !aSet.contains(b))
.forEach(this::operationY);
B.forEach(this::operationZ);
bSet.removeAll(A);
bSet.forEach(this::operationY);
B.forEach(this::operationZ);