Add size(Object) method to find the size of various collection-like objects

bug 27909, from Steven Melzer


git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/collections/trunk@131612 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Stephen Colebourne 2004-03-31 21:43:27 +00:00
parent c1d10f003e
commit c324046a54
4 changed files with 143 additions and 43 deletions

View File

@ -34,6 +34,7 @@ No interface changes, or deprecations have occurred.
<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>
<li>CollectionUtils - Add size(Object) method to find the size of various collection-like objects [27909]</li>
</ul>
<center><h3>BUG FIXES</h3></center>

View File

@ -174,6 +174,9 @@
<contributor>
<name>Brian McCallister</name>
</contributor>
<contributor>
<name>Steven Melzer</name>
</contributor>
<contributor>
<name>Leon Messerschmidt</name>
</contributor>

View File

@ -37,7 +37,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.56 $ $Date: 2004/02/18 01:15:42 $
* @version $Revision: 1.57 $ $Date: 2004/03/31 21:43:27 $
*
* @author Rodney Waldhoff
* @author Paul Jack
@ -48,6 +48,7 @@ import org.apache.commons.collections.collection.UnmodifiableCollection;
* @author Matthew Hawthorne
* @author Janek Bogucki
* @author Phil Steitz
* @author Steven Melzer
*/
public class CollectionUtils {
@ -739,13 +740,13 @@ public class CollectionUtils {
return ((Object[])obj)[idx];
}
else if(obj instanceof Enumeration) {
Enumeration enum = (Enumeration)obj;
while(enum.hasMoreElements()) {
Enumeration it = (Enumeration)obj;
while(it.hasMoreElements()) {
idx--;
if(idx == -1) {
return enum.nextElement();
return it.nextElement();
} else {
enum.nextElement();
it.nextElement();
}
}
}
@ -803,52 +804,88 @@ public class CollectionUtils {
*/
public static Object get(Object object, int index) {
if (index < 0) {
throw new IndexOutOfBoundsException("Index cannot be negative.");
throw new IndexOutOfBoundsException("Index cannot be negative: " + index);
}
if (object instanceof Map) {
Map map = (Map) object;
Iterator iterator = map.entrySet().iterator();
return get(iterator, index);
}
else if(object instanceof List) {
} else if (object instanceof List) {
return ((List) object).get(index);
}
else if(object instanceof Object[]) {
} else if (object instanceof Object[]) {
return ((Object[]) object)[index];
}
else if(object instanceof Enumeration) {
Enumeration enum = (Enumeration)object;
while(enum.hasMoreElements()) {
} else if (object instanceof Enumeration) {
Enumeration it = (Enumeration) object;
while (it.hasMoreElements()) {
index--;
if (index == -1) {
return enum.nextElement();
return it.nextElement();
} else {
enum.nextElement();
it.nextElement();
}
}
throw new IndexOutOfBoundsException("Entry does not exist.");
throw new IndexOutOfBoundsException("Entry does not exist: " + index);
} else if (object instanceof Iterator) {
Iterator it = (Iterator) object;
while (it.hasNext()) {
index--;
if (index == -1) {
return it.next();
} else {
it.next();
}
else if(object instanceof Iterator) {
return get((Iterator)object, index);
}
else if(object instanceof Collection) {
throw new IndexOutOfBoundsException("Entry does not exist: " + index);
} else if (object instanceof Collection) {
Iterator iterator = ((Collection) object).iterator();
return get(iterator, index);
} else {
throw new IllegalArgumentException("Unsupported object type.");
throw new IllegalArgumentException("Unsupported object type: " +
(object == null ? "null" : object.getClass().getName()));
}
}
private static Object get(Iterator iterator, int index) {
while(iterator.hasNext()) {
index--;
if(index == -1) {
return iterator.next();
/**
* Gets the size of the collection/iterator specified.
* <p>
* This method can handles objects as follows
* <ul>
* <li>Collection - the collection size
* <li>Map - the map size
* <li>Object array - the array size
* <li>Iterator - the number of elements remaining in the iterator
* <li>Enumeration - the number of elements remaining in the enumeration
* </ul>
*
* @param object the object to get the size of
* @return the size of the specified collection
* @throws IllegalArgumentException thrown if object is not recognised or null
*/
public static int size(Object object) {
int total = 0;
if (object instanceof Map) {
total = ((Map) object).size();
} else if (object instanceof Collection) {
total = ((Collection) object).size();
} else if (object instanceof Object[]) {
total = ((Object[]) object).length;
} else if (object instanceof Iterator) {
Iterator it = (Iterator) object;
while (it.hasNext()) {
total++;
it.next();
}
} else if (object instanceof Enumeration) {
Enumeration it = (Enumeration) object;
while (it.hasMoreElements()) {
total++;
it.nextElement();
}
} else {
iterator.next();
throw new IllegalArgumentException("Unsupported object type: " +
(object == null ? "null" : object.getClass().getName()));
}
}
throw new IndexOutOfBoundsException("Entry does not exist.");
return total;
}
/**

View File

@ -46,8 +46,9 @@ import org.apache.commons.collections.collection.UnmodifiableCollection;
* @author Matthew Hawthorne
* @author Stephen Colebourne
* @author Phil Steitz
* @author Steven Melzer
*
* @version $Revision: 1.35 $ $Date: 2004/02/18 01:20:35 $
* @version $Revision: 1.36 $ $Date: 2004/03/31 21:43:27 $
*/
public class TestCollectionUtils extends TestCase {
@ -686,7 +687,65 @@ public class TestCollectionUtils extends TestCase {
}
}
public void testSize_List() {
List list = new ArrayList();
assertEquals(0, CollectionUtils.size(list));
list.add("a");
assertEquals(1, CollectionUtils.size(list));
list.add("b");
assertEquals(2, CollectionUtils.size(list));
}
public void testSize_Map() {
Map map = new HashMap();
assertEquals(0, CollectionUtils.size(map));
map.put("1", "a");
assertEquals(1, CollectionUtils.size(map));
map.put("2", "b");
assertEquals(2, CollectionUtils.size(map));
}
public void testSize_Array() {
Object[] objectArray = new Object[0];
assertEquals(0, CollectionUtils.size(objectArray));
String[] stringArray = new String[3];
assertEquals(3, CollectionUtils.size(stringArray));
stringArray[0] = "a";
stringArray[1] = "b";
stringArray[2] = "c";
assertEquals(3, CollectionUtils.size(stringArray));
}
public void testSize_Enumeration() {
Vector list = new Vector();
assertEquals(0, CollectionUtils.size(list.elements()));
list.add("a");
assertEquals(1, CollectionUtils.size(list.elements()));
list.add("b");
assertEquals(2, CollectionUtils.size(list.elements()));
}
public void testSize_Iterator() {
List list = new ArrayList();
assertEquals(0, CollectionUtils.size(list.iterator()));
list.add("a");
assertEquals(1, CollectionUtils.size(list.iterator()));
list.add("b");
assertEquals(2, CollectionUtils.size(list.iterator()));
}
public void testSize_Other() {
try {
CollectionUtils.size(null);
fail("Expecting IllegalArgumentException");
} catch (IllegalArgumentException e) {}
try {
CollectionUtils.size("not a list");
fail("Expecting IllegalArgumentException");
} catch (IllegalArgumentException e) {}
try {
CollectionUtils.size(new int[0]);
fail("Expecting IllegalArgumentException");
} catch (IllegalArgumentException e) {}
}
//-----------------------------------------------------------------------
private static Predicate EQUALS_TWO = new Predicate() {
public boolean evaluate(Object input) {
return (input.equals("Two"));