java - 如何有效地从 Java 中的 LinkedHashMap 中删除条目?

标签 java loops iterator iteration linkedhashmap

我想从 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 对象,然后再次使用反射,您可以一路跟踪链接 map 。如果没有反射,这一切都是不可能的,因为与键对应的条目和条目之间的链接都不是通过公共(public) API 公开的。我不建议反射,因为如果 LinkedHashMap 的代码发生更改,您的代码将来很容易崩溃。

关于java - 如何有效地从 Java 中的 LinkedHashMap 中删除条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36430819/

相关文章:

java - 您正在探索通过 HTTP 而不是 HTTPS 描述或提供的 API

java - 类路径问题 :running ant java task with Maven Antrun plugin

java - 在循环中实例化对象而不会出现 OutOfMemoryError : Java heap space

javascript - 从数组中查找最小值

c++ - << 运算符模板的实现//C++

java - 使用正则表达式拆分字符串不返回任何值

java - 如何在 spring 中限制与数据库的连接数?

Python 将列表拆分为给定开始/结束关键字的子列表

c++ - 使用 `&*iter` 返回指向 iter 指向的对象的指针

rust - 如何从实现该特征的结构迭代器中收集特征向量