[英]FindBugs warning: Inefficient use of keySet iterator instead of entrySet iterator
[英]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.