diff --git a/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java b/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java index 85eb3dbc09..fc1dc9907e 100644 --- a/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java +++ b/src/main/java/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java @@ -92,7 +92,10 @@ public void remove() { if (!canRemove) { throw new IllegalStateException("Iterator remove() can only be called once after next()"); } + final int count = last.getCount(); decorated.remove(); + parent.size -= count; + parent.modCount++; last = null; canRemove = false; } @@ -267,7 +270,8 @@ public void remove() { } final int count = parent.getCount(lastElement); super.remove(); - parent.remove(lastElement, count); + parent.size -= count; + parent.modCount++; lastElement = null; canRemove = false; } diff --git a/src/test/java/org/apache/commons/collections4/multiset/HashMultiSetTest.java b/src/test/java/org/apache/commons/collections4/multiset/HashMultiSetTest.java index f8e47428dc..7254b02963 100644 --- a/src/test/java/org/apache/commons/collections4/multiset/HashMultiSetTest.java +++ b/src/test/java/org/apache/commons/collections4/multiset/HashMultiSetTest.java @@ -16,9 +16,12 @@ */ package org.apache.commons.collections4.multiset; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.InvalidObjectException; +import java.util.Iterator; import org.apache.commons.collections4.MultiSet; import org.junit.jupiter.api.Test; @@ -44,6 +47,26 @@ public MultiSet makeObject() { return new HashMultiSet<>(); } + @Test + void testViewIteratorRemoveKeepsSizeConsistent() { + final HashMultiSet multiset = new HashMultiSet<>(); + multiset.add("a", 3); + final Iterator unique = multiset.uniqueSet().iterator(); + unique.next(); + unique.remove(); + assertEquals(0, multiset.size()); + assertTrue(multiset.isEmpty()); + assertEquals(0, multiset.toArray().length); + + multiset.add("b", 4); + final Iterator> entries = multiset.entrySet().iterator(); + entries.next(); + entries.remove(); + assertEquals(0, multiset.size()); + assertTrue(multiset.isEmpty()); + assertEquals(0, multiset.toArray().length); + } + @Test void testDeserializeRejectsNonPositiveCount() throws Exception { final int marker = 0x11223344;