![](/img/trans.png)
[英]How can I use loop here, I want to remove 3 elements from list for every turn
[英]Is it more efficient to loop over a list each time or remove elements as I find the one I want in Java?
我有两个对象列表,比如 X 和 Y。
Y 的对象中有一个外键,显示它们分配给 X 的哪个 object。 这是一对一的关系,没有重复。 因此,每次找到 Y object 时,列表中就不再需要它了。
class X {
Long id;
Y y;
...
}
class Y {
Long id;
Long xId;
...
}
为 X 的每个 object 遍历 Y 列表会更有效,还是从列表中删除 Y object 会更快?
for(X x: xList) {
for(Y y: yList) {
if(y.getXId() == x.getId()) {
x.setY(y);
break;
}
}
}
对比
for(X x: xList) {
for(int i = 0; i < yList.size(); i++) {
Y y = yList.get(i);
if(y.getXId() == x.getId()) {
x.setY(y);
yList.remove(i);
i--;
break;
}
}
}
关于时间复杂度,两者都是二次的, O(n 2 ) 。 您的第二个选项在实践中可能1更快,但仍被视为O(n 2 ) 。
要使其成为线性O(n) ,您必须愿意花费O(n)额外空间。
下面的代码构建了一个辅助的 map,它具有由其 id 键控的X
实例。
Map<Long, X> xObjectsById = xList.stream()
.collect(Collectors.toMap(X::getId, Function.identity())));
然后,我们可以循环遍历Y
个对象,并从 map 中获取对应的X
for (Y y : yList) {
xObjectsById.get(y.getXId())
.setY(y);
}
1您已测量性能以得出结论。 此外,第二个选项执行额外的删除操作,必须考虑在内。 此外,它的表现好坏取决于您拥有的列表类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.