我有一个SortedMap<Long, List<MyType>>
,我想要删除List<MyType>
,如果List<MyType>
为空,我也会删除Long
密钥。
在Java 8中有一个优雅的解决方案吗?
使用此代码我得到ConcurrentModificationException
。
SortedMap<Long, List<MyType>> dates = ...
for (final Long key : this.getDates().keySet()) {
for (final Iterator<MyType> iterator = this.getDates().get(key).iterator();
iterator.hasNext();) {
final MyType myType= iterator.next();
if (myType.getMarker().intValue() == marker.intValue()) {
iterator.remove();
if (this.getDates().get(key).isEmpty()) {
this.getDates().remove(key);
}
break;
}
}
}
答案 0 :(得分:2)
第一位可写:
for (List<MyType> list : dates.values()) {
list.removeIf(myType -> myType.getMarker().intValue() == marker.intValue());
}
第二位可写:
dates.values().removeIf(List::isEmpty);
这需要两次通过,但在我看来,更容易理解(并且性能影响可能很小)。
替代迭代器:
for (Iterator<List<MyType>> it = dates.values().iterator(); it.hasNext();) {
List<MyType> list = it.next();
list.removeIf(myType -> myType.getMarker().intValue() == marker.intValue());
if (list.isEmpty()) it.remove();
}
答案 1 :(得分:2)
在Java 8中,集合现在可以使用removeIf()
方法:
getDates().values().forEach(list -> list.removeIf(myType -> myType.getMarker().intValue() == marker.intValue()));
getDates().values().removeIf(List::isEmpty);
答案 2 :(得分:0)
您可以迭代地图条目。对于每个条目,您可以使用嵌套迭代器删除匹配值。最后,删除条目,值列表为空:
Iterator<Entry<String, List<Integer>>> entryIterator = map.entrySet().iterator();
while (entryIterator.hasNext()) {
Entry<String, List<Integer>> entry = entryIterator.next();
Iterator<Integer> iterator = entry.getValue().iterator();
while (iterator.hasNext()) {
Integer value = iterator.next();
if (Objects.equal(value, marker)) {
iterator.remove();
}
}
if (entry.getValue().isEmpty()) {
entryIterator.remove();
}
}