[英]How to efficiently remove entries from a LinkedHashMap in Java?
我想從LinkedHashMap中刪除在具有給定鍵的項之后添加的所有項。
我的第一次嘗試是:
LinkedHashMap<String, SomeObject> var = new LinkedHashMap<String, SomeObject>();
public void removeEntriesAfter(String key) {
boolean deleteEntries = false;
for (String currentKey : var.keySet()) {
if(deleteEntries) {
var.remove(currentKey);
} else {
if(key.equalsIgnoreCase(currentKey)) {
// Do not remove the current entry
deleteEntries = true;
}
}
}
}
但是后來我收到了java.util.ConcurrentModificationException
。
我的第二個想法是先確定鍵,然后再刪除它們。
public void removeEntriesAfter(String key) {
boolean deleteEntries = false;
List<String> listOfEntriesToBeRemoved = new ArrayList<String>();
// Determine entries to be deleted
for (String currentKey : var.keySet()) {
if(deleteEntries) {
listOfEntriesToBeRemoved.add(currentKey);
} else {
if(key.equalsIgnoreCase(currentKey)) {
// Do not remove the current entry
deleteEntries = true;
}
}
}
// Removed selected entries
for (String currentKey : listOfEntriesToBeRemoved) {
var.remove(currentKey);
}
}
那行得通,但是我敢肯定有一種更優雅/更有效的方法。
為了避免ConcurrentModificationException
,可以使用Iterator
。
Iterator<String> it = map.keySet().iterator();
while (it.hasNext())
if (it.next().equalsIgnoreCase(currentKey))
break;
while (it.hasNext()) {
it.next();
it.remove();
}
如果您想要最有效的解決方案,那將是直接直接進入相應的條目。 為此,您只需將小寫鍵放入映射中(而不是放入任何舊字符串並使用equalsIgnoreCase
進行比較)。 然后,使用反射,您可以訪問與currentKey.toLowerCase()
對應的Map.Entry
對象,然后再次使用反射,您可以一直瀏覽整個地圖中的鏈接。 沒有反射就不可能做到這一點,因為與鍵對應的條目或條目之間的鏈接都不會通過公共API公開。 我不建議您使用反射,因為如果更改LinkedHashMap
的代碼,將來您的代碼很容易中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.