Add special cases for Set and Bag to CollectionUtils cardinality()

bug 28629, from Jon Schewe


git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/collections/trunk@131678 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Stephen Colebourne 2004-04-27 20:00:18 +00:00
parent 730b224f37
commit a249eba720
4 changed files with 54 additions and 22 deletions

View File

@ -43,6 +43,7 @@ No interface changes, or deprecations have occurred.
<li>Functors - Add get methods to retrieve internal state [27515]</li>
<li>Functors - Add additional getInstance() methods for consistency [27856,27857]</li>
<li>CollectionUtils - get(Object,int) method now supports primitive arrays</li>
<li>CollectionUtils - cardinality() now works faster for Set and Bag instances [28629]</li>
<li>CollectionUtils - Add size(Object) method to find the size of various collection-like objects [27909]</li>
<li>SingletonIterator - make remove() functionality optional</li>
<li>AbstractLinkedList/NodeCachingLinkedList - added getValue() and setValue() to Node, and made everything use them</li>

View File

@ -254,6 +254,9 @@
<contributor>
<name>Joe Raysa</name>
</contributor>
<contributor>
<name>Jon Schewe</name>
</contributor>
<contributor>
<name>Michael Smith</name>
</contributor>

View File

@ -38,7 +38,7 @@ import org.apache.commons.collections.collection.UnmodifiableCollection;
* Provides utility methods and decorators for {@link Collection} instances.
*
* @since Commons Collections 1.0
* @version $Revision: 1.60 $ $Date: 2004/04/01 22:43:13 $
* @version $Revision: 1.61 $ $Date: 2004/04/27 20:00:18 $
*
* @author Rodney Waldhoff
* @author Paul Jack
@ -50,6 +50,7 @@ import org.apache.commons.collections.collection.UnmodifiableCollection;
* @author Janek Bogucki
* @author Phil Steitz
* @author Steven Melzer
* @author Jon Schewe
*/
public class CollectionUtils {
@ -319,24 +320,29 @@ public class CollectionUtils {
}
/**
* Returns the number of occurrences of <i>obj</i>
* in <i>col</i>.
* Returns the number of occurrences of <i>obj</i> in <i>coll</i>.
*
* @param obj the object to find the cardinality of
* @param col the collection to search
* @return the the number of occurrences of obj in col
* @param coll the collection to search
* @return the the number of occurrences of obj in coll
*/
public static int cardinality(Object obj, final Collection col) {
public static int cardinality(Object obj, final Collection coll) {
if (coll instanceof Set) {
return (coll.contains(obj) ? 1 : 0);
}
if (coll instanceof Bag) {
return ((Bag) coll).getCount(obj);
}
int count = 0;
if(null == obj) {
for(Iterator it = col.iterator();it.hasNext();) {
if(null == it.next()) {
if (obj == null) {
for (Iterator it = coll.iterator();it.hasNext();) {
if (it.next() == null) {
count++;
}
}
} else {
for(Iterator it = col.iterator();it.hasNext();) {
if(obj.equals(it.next())) {
for (Iterator it = coll.iterator();it.hasNext();) {
if (obj.equals(it.next())) {
count++;
}
}

View File

@ -50,7 +50,7 @@ import org.apache.commons.collections.collection.UnmodifiableCollection;
* @author Phil Steitz
* @author Steven Melzer
*
* @version $Revision: 1.37 $ $Date: 2004/04/01 22:43:12 $
* @version $Revision: 1.38 $ $Date: 2004/04/27 20:00:18 $
*/
public class TestCollectionUtils extends TestCase {
@ -113,17 +113,39 @@ public class TestCollectionUtils extends TestCase {
}
public void testCardinality() {
assertEquals(1,CollectionUtils.cardinality("a",collectionA));
assertEquals(2,CollectionUtils.cardinality("b",collectionA));
assertEquals(3,CollectionUtils.cardinality("c",collectionA));
assertEquals(4,CollectionUtils.cardinality("d",collectionA));
assertEquals(0,CollectionUtils.cardinality("e",collectionA));
assertEquals(1, CollectionUtils.cardinality("a", collectionA));
assertEquals(2, CollectionUtils.cardinality("b", collectionA));
assertEquals(3, CollectionUtils.cardinality("c", collectionA));
assertEquals(4, CollectionUtils.cardinality("d", collectionA));
assertEquals(0, CollectionUtils.cardinality("e", collectionA));
assertEquals(0,CollectionUtils.cardinality("a",collectionB));
assertEquals(4,CollectionUtils.cardinality("b",collectionB));
assertEquals(3,CollectionUtils.cardinality("c",collectionB));
assertEquals(2,CollectionUtils.cardinality("d",collectionB));
assertEquals(1,CollectionUtils.cardinality("e",collectionB));
assertEquals(0, CollectionUtils.cardinality("a", collectionB));
assertEquals(4, CollectionUtils.cardinality("b", collectionB));
assertEquals(3, CollectionUtils.cardinality("c", collectionB));
assertEquals(2, CollectionUtils.cardinality("d", collectionB));
assertEquals(1, CollectionUtils.cardinality("e", collectionB));
Set set = new HashSet();
set.add("A");
set.add("C");
set.add("E");
set.add("E");
assertEquals(1, CollectionUtils.cardinality("A", set));
assertEquals(0, CollectionUtils.cardinality("B", set));
assertEquals(1, CollectionUtils.cardinality("C", set));
assertEquals(0, CollectionUtils.cardinality("D", set));
assertEquals(1, CollectionUtils.cardinality("E", set));
Bag bag = new HashBag();
bag.add("A", 3);
bag.add("C");
bag.add("E");
bag.add("E");
assertEquals(3, CollectionUtils.cardinality("A", bag));
assertEquals(0, CollectionUtils.cardinality("B", bag));
assertEquals(1, CollectionUtils.cardinality("C", bag));
assertEquals(0, CollectionUtils.cardinality("D", bag));
assertEquals(2, CollectionUtils.cardinality("E", bag));
}
public void testCardinalityOfNull() {