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