簡體   English   中英

FindBugs警告:無效使用keySet迭代器

[英]FindBugs warning: Inefficient use of keySet iterator

這個問題類似於[ FindBugs警告:keySet迭代器的效率低下,而不是entrySet迭代器

但是,我正在嘗試做一些不同的事情。 我當前的代碼在這里:

for (Double key2 : sortedPolygons.keySet()) {
    if (sortedPolygons.get(key2).getExteriorRing().equals(hole)) {
        sortedPolygons.remove(key2);
        break;
    }
}

在鏈接中執行類似解決方案的操作無效。 這是上述解決方案的實現:

for(Map.Entry<Double, Polygon> entry : sortedPolygons.entrySet()) {
    if (entry.getValue().getExteriorRing().equals(hole)) {
         .....

這里的問題是我試圖刪除該條目。 沒有entry.remove() 如何替換我的第一個代碼塊,而不會出現FindBugs錯誤:

無效使用keySet迭代器,而不是entrySet迭代器 ->

此方法使用從keySet迭代器檢索的密鑰訪問Map條目的值。 在地圖的entrySet上使用迭代器來避免Map.get(key)查找,效率更高。

注意,基礎結構是TreeMap ,無法更改。

我無法理解您的理由:在第一個代碼段中,您使用

sortedPolygons.remove(key2);

刪除密鑰。 沒有什么可以阻止您在第二個片段中執行相同的操作:

sortedPolygons.remove(entry.getKey());

無論采用哪種方式進行迭代,無論如何都會導致ConcurrentModificationException ,因為對於大多數集合而言,除非使用其迭代器,否則您無法在對其進行迭代時對其進行修改。

引用javadoc

所有此類的所有“集合視圖方法”返回的集合的迭代器方法返回的迭代器都是快速失敗的:如果在創建迭代器后的任何時候對結構進行了結構修改,則除了通過迭代器自己的remove之外,都可以通過其他方式進行修改方法,迭代器將拋出ConcurrentModificationException。

因此,代碼應為:

for (Iterator<Map.Entry<Double, Polygon>> it = sortedPolygons.entrySet().iterator(); it.hasNext(); ) {
    Map.Entry<Double, Polygon> entry = it.next();
    if (entry.getValue().getExteriorRing().equals(hole)) {
        it.remove();
        // if you want to exit the loop as soon as you found a match:
        break;
    }
}

如何按照建議使用entrySet()迭代器。

for(Iterator<Map.Entry<Double, Ploygon>> iter = sortedPolygons.entrySet().iterator(); 
         iter.hasNext();) {
    Map.Entry<Double, Ploygon> entry = iter.next();

    if (condition)
        iter.remove();
}

但是,您不需要密鑰,因此可以迭代值

for(Iterator<Ploygon> iter = sortedPolygons.values().iterator(); 
         iter.hasNext();) {
    Ploygon ploygon = iter.next();

    if (condition)
        iter.remove();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM