Java 在SortedMap上迭代并删除条目

Java 在SortedMap上迭代并删除条目,java,java-8,Java,Java 8,我有一个SortedMap,我想删除列表,如果列表为空,我也会删除长键 在Java8中是否有一个优雅的解决方案 通过这段代码,我得到一个ConcurrentModificationException 第一位可以写入: for (List<MyType> list : dates.values()) { list.removeIf(myType -> myType.getMarker().intValue() == marker.intValue()); } dates.v

我有一个SortedMap,我想删除列表,如果列表为空,我也会删除长键

在Java8中是否有一个优雅的解决方案

通过这段代码,我得到一个ConcurrentModificationException


第一位可以写入:

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

第一位可以写入:

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

您可以迭代映射条目。对于每个条目,可以使用嵌套迭代器删除匹配值。最后,如果值列表为空,则删除该条目:

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

您可以迭代映射条目。对于每个条目,可以使用嵌套迭代器删除匹配值。最后,如果值列表为空,则删除该条目:

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

在Java 8集合中,现在有了一种可以利用的方法:

getDates().values().forEach(list -> list.removeIf(myType -> myType.getMarker().intValue() == marker.intValue()));
getDates().values().removeIf(List::isEmpty);

在Java 8集合中,现在有了一种可以利用的方法:

getDates().values().forEach(list -> list.removeIf(myType -> myType.getMarker().intValue() == marker.intValue()));
getDates().values().removeIf(List::isEmpty);

伟大的解决方案-非常感谢!伟大的解决方案-非常感谢!有趣的是,您用Integer替换了MyType。我想知道这些原始代码的intValue调用是否真的是必要的,但我从来没有想到也要省略getMarker调用。如果value对象实际上是一个列表,那么一个简单的entry.getValue.removeAllsingletonmarker就足够了…@Holger sure。我只想展示如何使用迭代器正确地删除。我使用Integer是因为它更容易编写一个基本程序。有趣的是,你用Integer替换MyType成功了。我想知道这些原始代码的intValue调用是否真的是必要的,但我从来没有想到也要省略getMarker调用。如果value对象实际上是一个列表,那么一个简单的entry.getValue.removeAllsingletonmarker就足够了…@Holger sure。我只想展示如何使用迭代器正确地删除。我使用整数,因为它更容易写一个基本的程序。