
jodd.util.collection.Bag Maven / Gradle / Ivy
// Copyright (c) 2003-2012, Jodd Team (jodd.org). All Rights Reserved.
package jodd.util.collection;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
/**
* Bags are a specialization of unordered collections that explicitly allow duplicates.
*/
public interface Bag extends Collection {
/**
* Returns the number of occurrences (cardinality) of the given
* object currently in the bag. If the object does not exist in the
* bag, return 0.
*
* @param object the object to search for
* @return the number of occurrences of the object, zero if not found
*/
int getCount(Object object);
/**
* (Violation)
* Adds one copy the specified object to the Bag.
*
* If the object is already in the {@link #uniqueSet()} then increment its
* count as reported by {@link #getCount(Object)}. Otherwise add it to the
* {@link #uniqueSet()} and report its count as 1.
*
* Since this method always increases the size of the bag,
* according to the {@link Collection#add(Object)} contract, it
* should always return true
. Since it sometimes returns
* false
, this method violates the contract.
*
* @param object the object to add
* @return true
if the object was not already in the uniqueSet
*/
boolean add(E object);
/**
* Adds nCopies
copies of the specified object to the Bag.
*
* If the object is already in the {@link #uniqueSet()} then increment its
* count as reported by {@link #getCount(Object)}. Otherwise add it to the
* {@link #uniqueSet()} and report its count as nCopies
.
*
* @param object the object to add
* @param nCopies the number of copies to add
* @return true
if the object was not already in the uniqueSet
*/
boolean add(E object, int nCopies);
/**
* (Violation)
* Removes all occurrences of the given object from the bag.
*
* This will also remove the object from the {@link #uniqueSet()}.
*
* According to the {@link Collection#remove(Object)} method,
* this method should only remove the first occurrence of the
* given object, not all occurrences.
*
* @return true
if this call changed the collection
*/
boolean remove(Object object);
/**
* Removes nCopies
copies of the specified object from the Bag.
*
* If the number of copies to remove is greater than the actual number of
* copies in the Bag, no error is thrown.
*
* @param object the object to remove
* @param nCopies the number of copies to remove
* @return true
if this call changed the collection
*/
boolean remove(Object object, int nCopies);
/**
* Returns a {@link Set} of unique elements in the Bag.
*
* Uniqueness constraints are the same as those in {@link java.util.Set}.
*
* @return the Set of unique Bag elements
*/
Set uniqueSet();
/**
* Returns the total number of items in the bag across all types.
*
* @return the total size of the Bag
*/
int size();
/**
* (Violation)
* Returns true
if the bag contains all elements in
* the given collection, respecting cardinality. That is, if the
* given collection coll
contains n
copies
* of a given object, calling {@link #getCount(Object)} on that object must
* be >= n
for all n
in coll
.
*
* The {@link Collection#containsAll(Collection)} method specifies
* that cardinality should not be respected; this method should
* return true if the bag contains at least one of every object contained
* in the given collection.
*
* @param coll the collection to check against
* @return true
if the Bag contains all the collection
*/
boolean containsAll(Collection> coll);
/**
* (Violation)
* Remove all elements represented in the given collection,
* respecting cardinality. That is, if the given collection
* coll
contains n
copies of a given object,
* the bag will have n
fewer copies, assuming the bag
* had at least n
copies to begin with.
*
*
The {@link Collection#removeAll(Collection)} method specifies
* that cardinality should not be respected; this method should
* remove all occurrences of every object contained in the
* given collection.
*
* @param coll the collection to remove
* @return true
if this call changed the collection
*/
boolean removeAll(Collection> coll);
/**
* (Violation)
* Remove any members of the bag that are not in the given
* collection, respecting cardinality. That is, if the given
* collection coll
contains n
copies of a
* given object and the bag has m > n
copies, then
* delete m - n
copies from the bag. In addition, if
* e
is an object in the bag but
* !coll.contains(e)
, then remove e
and any
* of its copies.
*
*
The {@link Collection#retainAll(Collection)} method specifies
* that cardinality should not be respected; this method should
* keep all occurrences of every object contained in the
* given collection.
*
* @param coll the collection to retain
* @return true
if this call changed the collection
*/
boolean retainAll(Collection> coll);
/**
* Returns an {@link Iterator} over the entire set of members,
* including copies due to cardinality. This iterator is fail-fast
* and will not tolerate concurrent modifications.
*
* @return iterator over all elements in the Bag
*/
Iterator iterator();
}