繁体   English   中英

每次循环遍历列表或删除元素是否更有效,因为我在 Java 中找到了我想要的元素?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM