This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-collections.git
The following commit(s) were added to refs/heads/master by this push: new 3f7cb39b6 Add HashBag.HashBag(Iterable) 3f7cb39b6 is described below commit 3f7cb39b6d1828c02ba93c0622ae4fef1f29dda0 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sun Sep 1 17:24:20 2024 -0400 Add HashBag.HashBag(Iterable) - Add TreeBag.TreeBag(Iterable) --- src/changes/changes.xml | 2 ++ .../commons/collections4/bag/AbstractMapBag.java | 15 ++++++++++++++- .../org/apache/commons/collections4/bag/HashBag.java | 18 ++++++++++++++---- .../org/apache/commons/collections4/bag/TreeBag.java | 10 ++++++++++ .../multimap/AbstractMultiValuedMapTest.java | 14 +++++++++++++- 5 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a95400ec7..aa9767bbe 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -40,6 +40,8 @@ <action type="add" dev="ggregory" due-to="Gary Gregory, hemanth0525">Add CollectionUtils.duplicateList(Collection).</action> <action type="add" dev="ggregory" due-to="Gary Gregory, hemanth0525">Add CollectionUtils.duplicateSet(Collection).</action> <action type="add" dev="ggregory" due-to="Gary Gregory, hemanth0525">Add CollectionUtils.duplicateSequencedSet(Collection).</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add HashBag.HashBag(Iterable).</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add TreeBag.TreeBag(Iterable).</action> <!-- UPDATE --> <action issue="COLLECTIONS-857" type="update" dev="ggregory" due-to="Claude Warren">Update bloom filter documentation #508.</action> <action issue="COLLECTIONS-857" type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">Bump commons-codec:commons-codec from 1.17.0 to 1.17.1 #514.</action> diff --git a/src/main/java/org/apache/commons/collections4/bag/AbstractMapBag.java b/src/main/java/org/apache/commons/collections4/bag/AbstractMapBag.java index f4be8902a..d3fa5e6e1 100644 --- a/src/main/java/org/apache/commons/collections4/bag/AbstractMapBag.java +++ b/src/main/java/org/apache/commons/collections4/bag/AbstractMapBag.java @@ -25,6 +25,7 @@ import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Set; import org.apache.commons.collections4.Bag; @@ -165,7 +166,19 @@ public abstract class AbstractMapBag<E> implements Bag<E> { * @param map the map to assign */ protected AbstractMapBag(final Map<E, MutableInteger> map) { - this.map = map; + this.map = Objects.requireNonNull(map, "map"); + } + + /** + * Constructs a new instance that assigns the specified Map as the backing store. The map + * must be empty and non-null. The bag is filled from the iterable elements. + * + * @param map the map to assign. + * @param iterable The bag is filled from these iterable elements. + */ + protected AbstractMapBag(final Map<E, MutableInteger> map, final Iterable<? extends E> iterable) { + this(map); + iterable.forEach(this::add); } /** diff --git a/src/main/java/org/apache/commons/collections4/bag/HashBag.java b/src/main/java/org/apache/commons/collections4/bag/HashBag.java index 1335669aa..6b33ab8b7 100644 --- a/src/main/java/org/apache/commons/collections4/bag/HashBag.java +++ b/src/main/java/org/apache/commons/collections4/bag/HashBag.java @@ -50,13 +50,23 @@ public class HashBag<E> extends AbstractMapBag<E> implements Serializable { } /** - * Constructs a bag containing all the members of the given collection. + * Constructs a bag containing all the members of the given Collection. * - * @param coll a collection to copy into this bag + * @param collection a collection to copy into this bag. */ - public HashBag(final Collection<? extends E> coll) { + public HashBag(final Collection<? extends E> collection) { this(); - addAll(coll); + addAll(collection); + } + + /** + * Constructs a bag containing all the members of the given Iterable. + * + * @param iterable an iterable to copy into this bag. + * @since 4.5.0-M3 + */ + public HashBag(final Iterable<? extends E> iterable) { + super(new HashMap<>(), iterable); } /** diff --git a/src/main/java/org/apache/commons/collections4/bag/TreeBag.java b/src/main/java/org/apache/commons/collections4/bag/TreeBag.java index fa10f94db..14f7a6802 100644 --- a/src/main/java/org/apache/commons/collections4/bag/TreeBag.java +++ b/src/main/java/org/apache/commons/collections4/bag/TreeBag.java @@ -67,6 +67,16 @@ public class TreeBag<E> extends AbstractMapBag<E> implements SortedBag<E>, Seria addAll(coll); } + /** + * Constructs a bag containing all the members of the given Iterable. + * + * @param iterable an iterable to copy into this bag. + * @since 4.5.0-M3 + */ + public TreeBag(final Iterable<? extends E> iterable) { + super(new TreeMap<>(), iterable); + } + /** * Constructs an empty bag that maintains order on its unique representative * members according to the given {@link Comparator}. diff --git a/src/test/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMapTest.java b/src/test/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMapTest.java index ac80948e2..b2905b98f 100644 --- a/src/test/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMapTest.java +++ b/src/test/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMapTest.java @@ -931,7 +931,7 @@ public abstract class AbstractMultiValuedMapTest<K, V> extends AbstractObjectTes } @Test - public void testKeysBagIterator() { + public void testKeysBagIterator1() { final MultiValuedMap<K, V> map = makeFullMap(); final Collection<K> col = new ArrayList<>(map.keys()); final Bag<K> bag = new HashBag<>(col); @@ -942,6 +942,18 @@ public abstract class AbstractMultiValuedMapTest<K, V> extends AbstractObjectTes assertEquals(getSampleTotalValueCount(), bag.size()); } + @Test + public void testKeysBagIterator2() { + final MultiValuedMap<K, V> map = makeFullMap(); + final Iterable<K> iterable = new ArrayList<>(map.keys()); + final Bag<K> bag = new HashBag<>(iterable); + final int maxK = getSampleKeySize(); + for (int k = 0; k < maxK; k++) { + assertEquals(getSampleCountPerKey(), bag.getCount(makeKey(k))); + } + assertEquals(getSampleTotalValueCount(), bag.size()); + } + @Test public void testKeySetSize() { final MultiValuedMap<K, V> map = makeFullMap();