在SortedMap上迭代删除条目

时间:2015-10-20 15:06:54

标签: java java-8

我有一个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;
    }
  }
}

3 个答案:

答案 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();
        }
    }