簡體   English   中英

如何有效地從Java中的LinkedHashMap中刪除條目?

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

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