如何在Java中有效地从LinkedHashMap中删除条目?

如何在Java中有效地从LinkedHashMap中删除条目?,java,loops,iterator,iteration,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 : va

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

这是可行的,但我相信有一种更优雅、更高效的方法。

为了避免出现
并发修改异常
,您可以使用
迭代器

Iterator<String> it = map.keySet().iterator();
while (it.hasNext())
    if (it.next().equalsIgnoreCase(currentKey))
        break;
while (it.hasNext()) {
    it.next();
    it.remove();
}
Iterator it=map.keySet().Iterator();
while(it.hasNext())
if(it.next().equalsIgnoreCase(currentKey))
打破
while(it.hasNext()){
it.next();
it.remove();
}

如果您想要最有效的解决方案,首先应该直接进入适当的入口。要做到这一点,您只需将小写键放入映射(而不是放入任何旧字符串并使用
equalsIgnoreCase
进行比较)。然后,使用反射,您可以访问与
currentKey.toLowerCase()
相对应的
Map.Entry
对象,然后再次使用反射,您可以在整个映射中一直跟踪链接。如果没有反射,这一切都是不可能的,因为与键对应的条目或条目之间的链接都不会通过公共API公开。我不建议使用反射,因为如果
LinkedHashMap
的代码发生更改,您的代码将来可能很容易中断。

通过
m.keySet().iterator()获取密钥迭代器。
。调用
next()
,直到到达
键。在调用
remove()
/
next()
之后,直到
hasNext()
返回false。有趣的是,我认为
it.remove()
迭代器中删除,而不是从
LinkedHashMap中删除。这有点令人困惑,但似乎有效。
Iterator<String> it = map.keySet().iterator();
while (it.hasNext())
    if (it.next().equalsIgnoreCase(currentKey))
        break;
while (it.hasNext()) {
    it.next();
    it.remove();
}