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

Reply via email to