getElementSet();
/**
* Adds a single element to the multiset. This operation always increases
* the cardinality of the multiset by 1, assuming that the maximum capacity
* of Integer.MAX_VALUE has not been reached.
*
* @param item
* the char to be added to b
* @requires |b| < Integer.MAX_VALUE
* @alters b
* @ensures b = #b union {item}
*/
void add(char item);
/**
* Removes the target, if it is present in the multiset. The method returns
* true if and only if it changes the multiset. Note that this method
* removes only a single instance of the target. Thus, assuming
* the target is in the multiset, this method decreases the cardinality of
* the multiset by one.
*
* @param target
* the char to be removed
* @alters b
* @ensures (target not in #b) ==> (b = #b)
* (target in #b) ==> (b union {target} = #b)
* @return target in #b
*/
boolean remove(char target);
/**
* Returns a char chosen randomly based on the contents of the multiset.
* This operation does not remove the char from the multiset or change the
* multiset in any way. In particular, the cardinality of the multiset is
* the same before and after this method.
*
*
* Characters should be returned with a random distribution equal to the
* distribution of characters in the multiset. That is, for a character that
* appears N times in a multiset of cardinality M, the probability of that
* character being returned is N / M. For example, a multiset that contains
* only the character 'a', possibly many times, would always result in an
* 'a' being generated. On the other hand, a multiset with an equal number
* of 'a' and 'b' elements would return an 'a' approximately half the time
* and a 'b' the other half.
*
* @requires |b| >= 1
* @return char c with probability p, where:
* p = ||c,b|| / |b|
*/
char randomUniformChoose();
}