diff --git a/src/java/org/apache/commons/collections/AbstractBag.java b/src/java/org/apache/commons/collections/AbstractBag.java index 864aeee01..fd61130ad 100644 --- a/src/java/org/apache/commons/collections/AbstractBag.java +++ b/src/java/org/apache/commons/collections/AbstractBag.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/Attic/AbstractBag.java,v 1.2 2002/02/10 08:07:42 jstrachan Exp $ - * $Revision: 1.2 $ - * $Date: 2002/02/10 08:07:42 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/Attic/AbstractBag.java,v 1.3 2002/02/22 04:39:53 mas Exp $ + * $Revision: 1.3 $ + * $Date: 2002/02/22 04:39:53 $ * * ==================================================================== * @@ -63,6 +63,7 @@ package org.apache.commons.collections; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; @@ -73,8 +74,12 @@ import java.util.Set; /** * This class provides a skeletal implementation of the {@link Bag} * interface to minimize the effort required for target implementations. + * Subclasses need only to call {@link #setMap(Map)} in their constructor + * specifying a map instance that will be used to store the contents of + * the bag. * * @author Chuck Burdick + * @author Michael Smith **/ public abstract class AbstractBag implements Bag { private Map _map = null; @@ -91,7 +96,7 @@ public abstract class AbstractBag implements Bag { int count = (i + getCount(o)); _map.put(o, new Integer(count)); _total += i; - return (getCount(o) == i); + return (count == i); } else { return false; } @@ -139,13 +144,9 @@ public abstract class AbstractBag implements Bag { } public boolean equals(Object o) { - boolean result = false; - if (o instanceof AbstractBag) { - result = _map.equals(((AbstractBag)o).getMap()); - } else if (o instanceof Map) { - result = _map.equals((Map)o); - } - return result; + return (o == this || + (o != null && o.getClass().equals(this.getClass()) && + ((AbstractBag)o)._map.equals(this._map))); } public int hashCode() { @@ -203,12 +204,15 @@ public abstract class AbstractBag implements Bag { _mods++; boolean result = false; int count = getCount(o); - if (count > i) { + if (i <= 0) { + result = false; + } else if (count > i) { _map.put(o, new Integer(count - i)); result = true; _total -= i; - } else { - result = uniqueSet().remove(o); + } else { // count > 0 && count <= i + // need to remove all + result = (_map.remove(o) != null); _total -= count; } return result; @@ -274,7 +278,7 @@ public abstract class AbstractBag implements Bag { } public Set uniqueSet() { - return _map.keySet(); + return Collections.unmodifiableSet(_map.keySet()); } public int size() { @@ -316,7 +320,7 @@ public abstract class AbstractBag implements Bag { Iterator i = uniqueSet().iterator(); while (i.hasNext()) { Object current = i.next(); - for (int index = 0; index < getCount(current); index++) { + for (int index = getCount(current); index > 0; index--) { result.add(current); } } diff --git a/src/java/org/apache/commons/collections/Bag.java b/src/java/org/apache/commons/collections/Bag.java index 560f5d867..759dd09c7 100644 --- a/src/java/org/apache/commons/collections/Bag.java +++ b/src/java/org/apache/commons/collections/Bag.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/Bag.java,v 1.2 2002/02/10 08:07:42 jstrachan Exp $ - * $Revision: 1.2 $ - * $Date: 2002/02/10 08:07:42 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/Bag.java,v 1.3 2002/02/22 04:39:53 mas Exp $ + * $Revision: 1.3 $ + * $Date: 2002/02/22 04:39:53 $ * * ==================================================================== * @@ -113,7 +113,7 @@ public interface Bag extends Collection { /** * Remove the given number of occurrences from the bag. If the bag - * contains less than i occurrences, the item will be + * contains i occurrences or less, the item will be * removed from the {@link #uniqueSet}. * @see #getCount * @see #remove(Object)