如何在Java中有效地从LinkedHashMap中删除条目?
我想从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<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();
}