【问题标题】:How to efficiently remove entries from a LinkedHashMap in Java?如何有效地从 Java 中的 LinkedHashMap 中删除条目?
【发布时间】:2016-07-25 15:46:25
【问题描述】:

我想从 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);
  }
}

这行得通,但我确信有一种更优雅/更有效的方式来做到这一点。

【问题讨论】:

  • 通过m.keySet().iterator()获取密钥迭代器。致电next(),直到您到达key。之后调用 remove()/next() 直到 hasNext() 返回 false。

标签: java loops iterator iteration linkedhashmap


【解决方案1】:

要避免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 的代码发生更改,您的代码将来很容易中断。

【讨论】:

  • 有趣的是,我认为 it.remove();Iterator 中删除,而不是从 LinkedHashMap 中删除。这有点令人困惑,但似乎有效。
猜你喜欢
  • 2017-05-26
  • 2021-10-13
  • 2011-01-03
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多