You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2004/03/14 18:05:24 UTC
cvs commit: jakarta-commons/collections/src/java/org/apache/commons/collections MultiHashMap.java
scolebourne 2004/03/14 09:05:24
Modified: collections RELEASE-NOTES.html
collections/src/test/org/apache/commons/collections
TestMultiHashMap.java
collections/src/java/org/apache/commons/collections
MultiHashMap.java
Log:
Add five new methods to MultiHashMap to provide broader API
inspired by ideas/javadoc from Jesse Chan
Revision Changes Path
1.16 +1 -0 jakarta-commons/collections/RELEASE-NOTES.html
Index: RELEASE-NOTES.html
===================================================================
RCS file: /home/cvs/jakarta-commons/collections/RELEASE-NOTES.html,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- RELEASE-NOTES.html 14 Mar 2004 15:33:56 -0000 1.15
+++ RELEASE-NOTES.html 14 Mar 2004 17:05:24 -0000 1.16
@@ -33,6 +33,7 @@
<li>MultiKey - Add getKey(index) and size() methods and make constructor public</li>
<li>AbstractHashedMap,AbstractLinkedMap - Add methods to access entry methods when protected scope blocks</li>
<li>Functors - Add get methods to retrieve internal state [27515]</li>
+<li>MultiHashMap - Add five methods to improve the API</li>
</ul>
<center><h3>BUG FIXES</h3></center>
1.18 +102 -1 jakarta-commons/collections/src/test/org/apache/commons/collections/TestMultiHashMap.java
Index: TestMultiHashMap.java
===================================================================
RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/TestMultiHashMap.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- TestMultiHashMap.java 18 Feb 2004 01:20:35 -0000 1.17
+++ TestMultiHashMap.java 14 Mar 2004 17:05:24 -0000 1.18
@@ -15,6 +15,8 @@
*/
package org.apache.commons.collections;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
@@ -244,4 +246,103 @@
values = map.values();
super.verifyValues();
}
+
+ //-----------------------------------------------------------------------
+ public void testGetCollection() {
+ MultiHashMap map = new MultiHashMap();
+ map.put("A", "AA");
+ assertSame(map.get("A"), map.getCollection("A"));
+ }
+
+ public void testTotalSize() {
+ MultiHashMap map = new MultiHashMap();
+ assertEquals(0, map.totalSize());
+ map.put("A", "AA");
+ assertEquals(1, map.totalSize());
+ map.put("B", "BA");
+ assertEquals(2, map.totalSize());
+ map.put("B", "BB");
+ assertEquals(3, map.totalSize());
+ map.put("B", "BC");
+ assertEquals(4, map.totalSize());
+ map.remove("A");
+ assertEquals(3, map.totalSize());
+ map.remove("B", "BC");
+ assertEquals(2, map.totalSize());
+ }
+
+ public void testSize_Key() {
+ MultiHashMap map = new MultiHashMap();
+ assertEquals(0, map.size("A"));
+ assertEquals(0, map.size("B"));
+ map.put("A", "AA");
+ assertEquals(1, map.size("A"));
+ assertEquals(0, map.size("B"));
+ map.put("B", "BA");
+ assertEquals(1, map.size("A"));
+ assertEquals(1, map.size("B"));
+ map.put("B", "BB");
+ assertEquals(1, map.size("A"));
+ assertEquals(2, map.size("B"));
+ map.put("B", "BC");
+ assertEquals(1, map.size("A"));
+ assertEquals(3, map.size("B"));
+ map.remove("A");
+ assertEquals(0, map.size("A"));
+ assertEquals(3, map.size("B"));
+ map.remove("B", "BC");
+ assertEquals(0, map.size("A"));
+ assertEquals(2, map.size("B"));
+ }
+
+ public void testIterator_Key() {
+ MultiHashMap map = new MultiHashMap();
+ assertEquals(false, map.iterator("A").hasNext());
+ map.put("A", "AA");
+ Iterator it = map.iterator("A");
+ assertEquals(true, it.hasNext());
+ it.next();
+ assertEquals(false, it.hasNext());
+ }
+
+ public void testContainsValue_Key() {
+ MultiHashMap map = new MultiHashMap();
+ assertEquals(false, map.containsValue("A", "AA"));
+ assertEquals(false, map.containsValue("B", "BB"));
+ map.put("A", "AA");
+ assertEquals(true, map.containsValue("A", "AA"));
+ assertEquals(false, map.containsValue("A", "AB"));
+ }
+
+ public void testPutAll_KeyCollection() {
+ MultiHashMap map = new MultiHashMap();
+ Collection coll = Arrays.asList(new Object[] {"X", "Y", "Z"});
+
+ assertEquals(true, map.putAll("A", coll));
+ assertEquals(3, map.size("A"));
+ assertEquals(true, map.containsValue("A", "X"));
+ assertEquals(true, map.containsValue("A", "Y"));
+ assertEquals(true, map.containsValue("A", "Z"));
+
+ assertEquals(false, map.putAll("A", null));
+ assertEquals(3, map.size("A"));
+ assertEquals(true, map.containsValue("A", "X"));
+ assertEquals(true, map.containsValue("A", "Y"));
+ assertEquals(true, map.containsValue("A", "Z"));
+
+ assertEquals(false, map.putAll("A", new ArrayList()));
+ assertEquals(3, map.size("A"));
+ assertEquals(true, map.containsValue("A", "X"));
+ assertEquals(true, map.containsValue("A", "Y"));
+ assertEquals(true, map.containsValue("A", "Z"));
+
+ coll = Arrays.asList(new Object[] {"M"});
+ assertEquals(true, map.putAll("A", coll));
+ assertEquals(4, map.size("A"));
+ assertEquals(true, map.containsValue("A", "X"));
+ assertEquals(true, map.containsValue("A", "Y"));
+ assertEquals(true, map.containsValue("A", "Z"));
+ assertEquals(true, map.containsValue("A", "M"));
+ }
+
}
1.17 +101 -4 jakarta-commons/collections/src/java/org/apache/commons/collections/MultiHashMap.java
Index: MultiHashMap.java
===================================================================
RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/MultiHashMap.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- MultiHashMap.java 14 Mar 2004 15:33:57 -0000 1.16
+++ MultiHashMap.java 14 Mar 2004 17:05:24 -0000 1.17
@@ -131,6 +131,64 @@
//-----------------------------------------------------------------------
/**
+ * Gets the total size of the map by counting all the values.
+ *
+ * @return the total size of the map counting all values
+ * @since Commons Collections 3.1
+ */
+ public int totalSize() {
+ int total = 0;
+ Collection values = super.values();
+ for (Iterator it = values.iterator(); it.hasNext();) {
+ Collection coll = (Collection) it.next();
+ total += coll.size();
+ }
+ return total;
+ }
+
+ /**
+ * Gets the collection mapped to the specified key.
+ * This method is a convenience method to typecast the result of <code>get(key)</code>.
+ *
+ * @param key the key to retrieve
+ * @return the collection mapped to the key, null if no mapping
+ * @since Commons Collections 3.1
+ */
+ public Collection getCollection(Object key) {
+ return (Collection) get(key);
+ }
+
+ /**
+ * Gets the size of the collection mapped to the specified key.
+ *
+ * @param key the key to get size for
+ * @return the size of the collection at the key, zero if key not in map
+ * @since Commons Collections 3.1
+ */
+ public int size(Object key) {
+ Collection coll = getCollection(key);
+ if (coll == null) {
+ return 0;
+ }
+ return coll.size();
+ }
+
+ /**
+ * Gets an iterator for the collection mapped to the specified key.
+ *
+ * @param key the key to get an iterator for
+ * @return the iterator of the collection at the key, empty iterator if key not in map
+ * @since Commons Collections 3.1
+ */
+ public Iterator iterator(Object key) {
+ Collection coll = getCollection(key);
+ if (coll == null) {
+ return IteratorUtils.EMPTY_ITERATOR;
+ }
+ return coll.iterator();
+ }
+
+ /**
* Adds the value to the collection associated with the specified key.
* <p>
* Unlike a normal <code>Map</code> the previous value is not replaced.
@@ -143,17 +201,41 @@
public Object put(Object key, Object value) {
// NOTE:: put is called during deserialization in JDK < 1.4 !!!!!!
// so we must have a readObject()
- Collection coll = (Collection) super.get(key);
+ Collection coll = getCollection(key);
if (coll == null) {
coll = createCollection(null);
super.put(key, coll);
}
boolean results = coll.add(value);
-
return (results ? value : null);
}
/**
+ * Adds a collection of values to the collection associated with the specified key.
+ *
+ * @param key the key to store against
+ * @param values the values to add to the collection at the key, null ignored
+ * @return true if this map changed
+ * @since Commons Collections 3.1
+ */
+ public boolean putAll(Object key, Collection values) {
+ if (values == null || values.size() == 0) {
+ return false;
+ }
+ Collection coll = getCollection(key);
+ if (coll == null) {
+ coll = createCollection(values);
+ if (coll.size() == 0) {
+ return false;
+ }
+ super.put(key, coll);
+ return true;
+ } else {
+ return coll.addAll(values);
+ }
+ }
+
+ /**
* Checks whether the map contains the value specified.
* <p>
* This checks all collections against all keys for the value, and thus could be slow.
@@ -179,6 +261,21 @@
}
/**
+ * Checks whether the collection at the specified key contains the value.
+ *
+ * @param value the value to search for
+ * @return true if the map contains the value
+ * @since Commons Collections 3.1
+ */
+ public boolean containsValue(Object key, Object value) {
+ Collection coll = getCollection(key);
+ if (coll == null) {
+ return false;
+ }
+ return coll.contains(value);
+ }
+
+ /**
* Removes a specific value from map.
* <p>
* The item is removed from the collection mapped to the specified key.
@@ -192,7 +289,7 @@
* @return the value removed (which was passed in), null if nothing removed
*/
public Object remove(Object key, Object item) {
- Collection valuesForKey = (Collection) super.get(key);
+ Collection valuesForKey = getCollection(key);
if (valuesForKey == null) {
return null;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org