簡體   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