Cleanup bidimap package: package-info.java, version, author tags, javadoc.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/collections/trunk@1353747 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f2086a2105
commit
c94dfb59c0
|
@ -33,12 +33,10 @@ import org.apache.commons.collections.map.AbstractMapDecorator;
|
||||||
* But, you might want that loophole, so this class is kept simple.
|
* But, you might want that loophole, so this class is kept simple.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Revision$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractBidiMapDecorator<K, V> extends AbstractMapDecorator<K, V> implements
|
public abstract class AbstractBidiMapDecorator<K, V>
|
||||||
BidiMap<K, V> {
|
extends AbstractMapDecorator<K, V> implements BidiMap<K, V> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor that wraps (not copies).
|
* Constructor that wraps (not copies).
|
||||||
|
@ -66,14 +64,23 @@ public abstract class AbstractBidiMapDecorator<K, V> extends AbstractMapDecorato
|
||||||
return decorated().mapIterator();
|
return decorated().mapIterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K getKey(Object value) {
|
public K getKey(Object value) {
|
||||||
return decorated().getKey(value);
|
return decorated().getKey(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K removeValue(Object value) {
|
public K removeValue(Object value) {
|
||||||
return decorated().removeValue(value);
|
return decorated().removeValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public BidiMap<V, K> inverseBidiMap() {
|
public BidiMap<V, K> inverseBidiMap() {
|
||||||
return decorated().inverseBidiMap();
|
return decorated().inverseBidiMap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,18 +29,15 @@ import org.apache.commons.collections.iterators.AbstractIteratorDecorator;
|
||||||
import org.apache.commons.collections.keyvalue.AbstractMapEntryDecorator;
|
import org.apache.commons.collections.keyvalue.AbstractMapEntryDecorator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract <code>BidiMap</code> implemented using two maps.
|
* Abstract {@link BidiMap} implemented using two maps.
|
||||||
* <p>
|
* <p>
|
||||||
* An implementation can be written simply by implementing the
|
* An implementation can be written simply by implementing the
|
||||||
* <code>createMap</code> method.
|
* {@link #createBidiMap(Map, Map, BidiMap)} method.
|
||||||
*
|
*
|
||||||
* @see DualHashBidiMap
|
* @see DualHashBidiMap
|
||||||
* @see DualTreeBidiMap
|
* @see DualTreeBidiMap
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Matthew Hawthorne
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
|
|
||||||
|
@ -132,18 +129,31 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
|
|
||||||
// Map delegation
|
// Map delegation
|
||||||
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public V get(Object key) {
|
public V get(Object key) {
|
||||||
return normalMap.get(key);
|
return normalMap.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public int size() {
|
public int size() {
|
||||||
return normalMap.size();
|
return normalMap.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return normalMap.isEmpty();
|
return normalMap.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public boolean containsKey(Object key) {
|
public boolean containsKey(Object key) {
|
||||||
return normalMap.containsKey(key);
|
return normalMap.containsKey(key);
|
||||||
}
|
}
|
||||||
|
@ -165,6 +175,10 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
|
|
||||||
// BidiMap changes
|
// BidiMap changes
|
||||||
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public V put(K key, V value) {
|
public V put(K key, V value) {
|
||||||
if (normalMap.containsKey(key)) {
|
if (normalMap.containsKey(key)) {
|
||||||
reverseMap.remove(normalMap.get(key));
|
reverseMap.remove(normalMap.get(key));
|
||||||
|
@ -177,12 +191,18 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public void putAll(Map<? extends K, ? extends V> map) {
|
public void putAll(Map<? extends K, ? extends V> map) {
|
||||||
for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
|
for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
|
||||||
put(entry.getKey(), entry.getValue());
|
put(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public V remove(Object key) {
|
public V remove(Object key) {
|
||||||
V value = null;
|
V value = null;
|
||||||
if (normalMap.containsKey(key)) {
|
if (normalMap.containsKey(key)) {
|
||||||
|
@ -192,11 +212,17 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public void clear() {
|
public void clear() {
|
||||||
normalMap.clear();
|
normalMap.clear();
|
||||||
reverseMap.clear();
|
reverseMap.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public boolean containsValue(Object value) {
|
public boolean containsValue(Object value) {
|
||||||
return reverseMap.containsKey(value);
|
return reverseMap.containsKey(value);
|
||||||
}
|
}
|
||||||
|
@ -218,10 +244,16 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
return new BidiMapIterator<K, V>(this);
|
return new BidiMapIterator<K, V>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K getKey(Object value) {
|
public K getKey(Object value) {
|
||||||
return reverseMap.get(value);
|
return reverseMap.get(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K removeValue(Object value) {
|
public K removeValue(Object value) {
|
||||||
K key = null;
|
K key = null;
|
||||||
if (reverseMap.containsKey(value)) {
|
if (reverseMap.containsKey(value)) {
|
||||||
|
@ -231,6 +263,9 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public BidiMap<V, K> inverseBidiMap() {
|
public BidiMap<V, K> inverseBidiMap() {
|
||||||
if (inverseBidiMap == null) {
|
if (inverseBidiMap == null) {
|
||||||
inverseBidiMap = createBidiMap(reverseMap, normalMap, this);
|
inverseBidiMap = createBidiMap(reverseMap, normalMap, this);
|
||||||
|
@ -657,7 +692,8 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
K key = MapEntry.this.getKey();
|
K key = MapEntry.this.getKey();
|
||||||
if (parent.reverseMap.containsKey(value) &&
|
if (parent.reverseMap.containsKey(value) &&
|
||||||
parent.reverseMap.get(value) != key) {
|
parent.reverseMap.get(value) != key) {
|
||||||
throw new IllegalArgumentException("Cannot use setValue() when the object being set is already in the map");
|
throw new IllegalArgumentException(
|
||||||
|
"Cannot use setValue() when the object being set is already in the map");
|
||||||
}
|
}
|
||||||
parent.put(key, value);
|
parent.put(key, value);
|
||||||
final V oldValue = super.setValue(value);
|
final V oldValue = super.setValue(value);
|
||||||
|
@ -692,16 +728,19 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
this.iterator = parent.normalMap.entrySet().iterator();
|
this.iterator = parent.normalMap.entrySet().iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return iterator.hasNext();
|
return iterator.hasNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public K next() {
|
public K next() {
|
||||||
last = iterator.next();
|
last = iterator.next();
|
||||||
canRemove = true;
|
canRemove = true;
|
||||||
return last.getKey();
|
return last.getKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public void remove() {
|
public void remove() {
|
||||||
if (canRemove == false) {
|
if (canRemove == false) {
|
||||||
throw new IllegalStateException("Iterator remove() can only be called once after next()");
|
throw new IllegalStateException("Iterator remove() can only be called once after next()");
|
||||||
|
@ -714,31 +753,39 @@ public abstract class AbstractDualBidiMap<K, V> implements BidiMap<K, V> {
|
||||||
canRemove = false;
|
canRemove = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public K getKey() {
|
public K getKey() {
|
||||||
if (last == null) {
|
if (last == null) {
|
||||||
throw new IllegalStateException("Iterator getKey() can only be called after next() and before remove()");
|
throw new IllegalStateException(
|
||||||
|
"Iterator getKey() can only be called after next() and before remove()");
|
||||||
}
|
}
|
||||||
return last.getKey();
|
return last.getKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public V getValue() {
|
public V getValue() {
|
||||||
if (last == null) {
|
if (last == null) {
|
||||||
throw new IllegalStateException("Iterator getValue() can only be called after next() and before remove()");
|
throw new IllegalStateException(
|
||||||
|
"Iterator getValue() can only be called after next() and before remove()");
|
||||||
}
|
}
|
||||||
return last.getValue();
|
return last.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public V setValue(V value) {
|
public V setValue(V value) {
|
||||||
if (last == null) {
|
if (last == null) {
|
||||||
throw new IllegalStateException("Iterator setValue() can only be called after next() and before remove()");
|
throw new IllegalStateException(
|
||||||
|
"Iterator setValue() can only be called after next() and before remove()");
|
||||||
}
|
}
|
||||||
if (parent.reverseMap.containsKey(value) &&
|
if (parent.reverseMap.containsKey(value) &&
|
||||||
parent.reverseMap.get(value) != last.getKey()) {
|
parent.reverseMap.get(value) != last.getKey()) {
|
||||||
throw new IllegalArgumentException("Cannot use setValue() when the object being set is already in the map");
|
throw new IllegalArgumentException(
|
||||||
|
"Cannot use setValue() when the object being set is already in the map");
|
||||||
}
|
}
|
||||||
return parent.put(last.getKey(), value);
|
return parent.put(last.getKey(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public void reset() {
|
public void reset() {
|
||||||
iterator = parent.normalMap.entrySet().iterator();
|
iterator = parent.normalMap.entrySet().iterator();
|
||||||
last = null;
|
last = null;
|
||||||
|
|
|
@ -32,9 +32,7 @@ import org.apache.commons.collections.OrderedMapIterator;
|
||||||
* But, you might want that loophole, so this class is kept simple.
|
* But, you might want that loophole, so this class is kept simple.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Revision$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractOrderedBidiMapDecorator<K, V>
|
public abstract class AbstractOrderedBidiMapDecorator<K, V>
|
||||||
extends AbstractBidiMapDecorator<K, V>
|
extends AbstractBidiMapDecorator<K, V>
|
||||||
|
@ -66,18 +64,30 @@ public abstract class AbstractOrderedBidiMapDecorator<K, V>
|
||||||
return decorated().mapIterator();
|
return decorated().mapIterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K firstKey() {
|
public K firstKey() {
|
||||||
return decorated().firstKey();
|
return decorated().firstKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K lastKey() {
|
public K lastKey() {
|
||||||
return decorated().lastKey();
|
return decorated().lastKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K nextKey(K key) {
|
public K nextKey(K key) {
|
||||||
return decorated().nextKey(key);
|
return decorated().nextKey(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K previousKey(K key) {
|
public K previousKey(K key) {
|
||||||
return decorated().previousKey(key);
|
return decorated().previousKey(key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,12 +34,10 @@ import org.apache.commons.collections.SortedBidiMap;
|
||||||
* But, you might want that loophole, so this class is kept simple.
|
* But, you might want that loophole, so this class is kept simple.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Revision$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractSortedBidiMapDecorator<K, V> extends
|
public abstract class AbstractSortedBidiMapDecorator<K, V>
|
||||||
AbstractOrderedBidiMapDecorator<K, V> implements SortedBidiMap<K, V> {
|
extends AbstractOrderedBidiMapDecorator<K, V> implements SortedBidiMap<K, V> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor that wraps (not copies).
|
* Constructor that wraps (not copies).
|
||||||
|
@ -67,22 +65,37 @@ public abstract class AbstractSortedBidiMapDecorator<K, V> extends
|
||||||
return decorated().inverseBidiMap();
|
return decorated().inverseBidiMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Comparator<? super K> comparator() {
|
public Comparator<? super K> comparator() {
|
||||||
return decorated().comparator();
|
return decorated().comparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Comparator<? super V> valueComparator() {
|
public Comparator<? super V> valueComparator() {
|
||||||
return decorated().valueComparator();
|
return decorated().valueComparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public SortedMap<K, V> subMap(K fromKey, K toKey) {
|
public SortedMap<K, V> subMap(K fromKey, K toKey) {
|
||||||
return decorated().subMap(fromKey, toKey);
|
return decorated().subMap(fromKey, toKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public SortedMap<K, V> headMap(K toKey) {
|
public SortedMap<K, V> headMap(K toKey) {
|
||||||
return decorated().headMap(toKey);
|
return decorated().headMap(toKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public SortedMap<K, V> tailMap(K fromKey) {
|
public SortedMap<K, V> tailMap(K fromKey) {
|
||||||
return decorated().tailMap(fromKey);
|
return decorated().tailMap(fromKey);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,21 +26,18 @@ import java.util.Map;
|
||||||
import org.apache.commons.collections.BidiMap;
|
import org.apache.commons.collections.BidiMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of <code>BidiMap</code> that uses two <code>HashMap</code> instances.
|
* Implementation of {@link BidiMap} that uses two {@link HashMap} instances.
|
||||||
* <p>
|
* <p>
|
||||||
* Two <code>HashMap</code> instances are used in this class.
|
* Two {@link HashMap} instances are used in this class.
|
||||||
* This provides fast lookups at the expense of storing two sets of map entries.
|
* This provides fast lookups at the expense of storing two sets of map entries.
|
||||||
* Commons Collections would welcome the addition of a direct hash-based
|
* Commons Collections would welcome the addition of a direct hash-based
|
||||||
* implementation of the <code>BidiMap</code> interface.
|
* implementation of the {@link BidiMap} interface.
|
||||||
* <p>
|
* <p>
|
||||||
* NOTE: From Commons Collections 3.1, all subclasses will use <code>HashMap</code>
|
* NOTE: From Commons Collections 3.1, all subclasses will use {@link HashMap}
|
||||||
* and the flawed <code>createMap</code> method is ignored.
|
* and the flawed <code>createMap</code> method is ignored.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Matthew Hawthorne
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public class DualHashBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements Serializable {
|
public class DualHashBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements Serializable {
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ import org.apache.commons.collections.SortedBidiMap;
|
||||||
import org.apache.commons.collections.map.AbstractSortedMapDecorator;
|
import org.apache.commons.collections.map.AbstractSortedMapDecorator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of <code>BidiMap</code> that uses two <code>TreeMap</code> instances.
|
* Implementation of {@link BidiMap} that uses two {@link TreeMap} instances.
|
||||||
* <p>
|
* <p>
|
||||||
* The setValue() method on iterators will succeed only if the new value being set is
|
* The setValue() method on iterators will succeed only if the new value being set is
|
||||||
* not already in the bidimap.
|
* not already in the bidimap.
|
||||||
|
@ -46,17 +46,14 @@ import org.apache.commons.collections.map.AbstractSortedMapDecorator;
|
||||||
* also be considered. It implements the interface using a dedicated design, and does
|
* also be considered. It implements the interface using a dedicated design, and does
|
||||||
* not store each object twice, which can save on memory use.
|
* not store each object twice, which can save on memory use.
|
||||||
* <p>
|
* <p>
|
||||||
* NOTE: From Commons Collections 3.1, all subclasses will use <code>TreeMap</code>
|
* NOTE: From Commons Collections 3.1, all subclasses will use {@link TreeMap}
|
||||||
* and the flawed <code>createMap</code> method is ignored.
|
* and the flawed <code>createMap</code> method is ignored.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Matthew Hawthorne
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public class DualTreeBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements
|
public class DualTreeBidiMap<K, V> extends AbstractDualBidiMap<K, V>
|
||||||
SortedBidiMap<K, V>, Serializable {
|
implements SortedBidiMap<K, V>, Serializable {
|
||||||
|
|
||||||
/** Ensure serialization compatibility */
|
/** Ensure serialization compatibility */
|
||||||
private static final long serialVersionUID = 721969328361809L;
|
private static final long serialVersionUID = 721969328361809L;
|
||||||
|
@ -90,9 +87,10 @@ public class DualTreeBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a <code>DualTreeBidiMap</code> using the specified Comparator.
|
* Constructs a {@link DualTreeBidiMap} using the specified {@link Comparator}.
|
||||||
*
|
*
|
||||||
* @param keyComparator the Comparator
|
* @param keyComparator the comparator
|
||||||
|
* @param valueComparator the values comparator to use
|
||||||
*/
|
*/
|
||||||
public DualTreeBidiMap(Comparator<? super K> keyComparator, Comparator<? super V> valueComparator) {
|
public DualTreeBidiMap(Comparator<? super K> keyComparator, Comparator<? super V> valueComparator) {
|
||||||
super(new TreeMap<K, V>(keyComparator), new TreeMap<V, K>(valueComparator));
|
super(new TreeMap<K, V>(keyComparator), new TreeMap<V, K>(valueComparator));
|
||||||
|
@ -101,7 +99,7 @@ public class DualTreeBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a <code>DualTreeBidiMap</code> that decorates the specified maps.
|
* Constructs a {@link DualTreeBidiMap} that decorates the specified maps.
|
||||||
*
|
*
|
||||||
* @param normalMap the normal direction map
|
* @param normalMap the normal direction map
|
||||||
* @param reverseMap the reverse direction map
|
* @param reverseMap the reverse direction map
|
||||||
|
@ -127,23 +125,39 @@ public class DualTreeBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Comparator<? super K> comparator() {
|
public Comparator<? super K> comparator() {
|
||||||
return ((SortedMap<K, V>) normalMap).comparator();
|
return ((SortedMap<K, V>) normalMap).comparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Comparator<? super V> valueComparator() {
|
public Comparator<? super V> valueComparator() {
|
||||||
return ((SortedMap<V, K>) reverseMap).comparator();
|
return ((SortedMap<V, K>) reverseMap).comparator();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K firstKey() {
|
public K firstKey() {
|
||||||
return ((SortedMap<K, V>) normalMap).firstKey();
|
return ((SortedMap<K, V>) normalMap).firstKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K lastKey() {
|
public K lastKey() {
|
||||||
return ((SortedMap<K, V>) normalMap).lastKey();
|
return ((SortedMap<K, V>) normalMap).lastKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K nextKey(K key) {
|
public K nextKey(K key) {
|
||||||
if (isEmpty()) {
|
if (isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -160,6 +174,9 @@ public class DualTreeBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public K previousKey(K key) {
|
public K previousKey(K key) {
|
||||||
if (isEmpty()) {
|
if (isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -189,25 +206,41 @@ public class DualTreeBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements
|
||||||
return new BidiOrderedMapIterator<K, V>(this);
|
return new BidiOrderedMapIterator<K, V>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public SortedBidiMap<V, K> inverseSortedBidiMap() {
|
public SortedBidiMap<V, K> inverseSortedBidiMap() {
|
||||||
return inverseBidiMap();
|
return inverseBidiMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public OrderedBidiMap<V, K> inverseOrderedBidiMap() {
|
public OrderedBidiMap<V, K> inverseOrderedBidiMap() {
|
||||||
return inverseBidiMap();
|
return inverseBidiMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public SortedMap<K, V> headMap(K toKey) {
|
public SortedMap<K, V> headMap(K toKey) {
|
||||||
SortedMap<K, V> sub = ((SortedMap<K, V>) normalMap).headMap(toKey);
|
SortedMap<K, V> sub = ((SortedMap<K, V>) normalMap).headMap(toKey);
|
||||||
return new ViewMap<K, V>(this, sub);
|
return new ViewMap<K, V>(this, sub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public SortedMap<K, V> tailMap(K fromKey) {
|
public SortedMap<K, V> tailMap(K fromKey) {
|
||||||
SortedMap<K, V> sub = ((SortedMap<K, V>) normalMap).tailMap(fromKey);
|
SortedMap<K, V> sub = ((SortedMap<K, V>) normalMap).tailMap(fromKey);
|
||||||
return new ViewMap<K, V>(this, sub);
|
return new ViewMap<K, V>(this, sub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public SortedMap<K, V> subMap(K fromKey, K toKey) {
|
public SortedMap<K, V> subMap(K fromKey, K toKey) {
|
||||||
SortedMap<K, V> sub = ((SortedMap<K, V>) normalMap).subMap(fromKey, toKey);
|
SortedMap<K, V> sub = ((SortedMap<K, V>) normalMap).subMap(fromKey, toKey);
|
||||||
return new ViewMap<K, V>(this, sub);
|
return new ViewMap<K, V>(this, sub);
|
||||||
|
@ -313,55 +346,68 @@ public class DualTreeBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements
|
||||||
iterator = new ArrayList<Map.Entry<K, V>>(parent.entrySet()).listIterator();
|
iterator = new ArrayList<Map.Entry<K, V>>(parent.entrySet()).listIterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return iterator.hasNext();
|
return iterator.hasNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public K next() {
|
public K next() {
|
||||||
last = iterator.next();
|
last = iterator.next();
|
||||||
return last.getKey();
|
return last.getKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public boolean hasPrevious() {
|
public boolean hasPrevious() {
|
||||||
return iterator.hasPrevious();
|
return iterator.hasPrevious();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public K previous() {
|
public K previous() {
|
||||||
last = iterator.previous();
|
last = iterator.previous();
|
||||||
return last.getKey();
|
return last.getKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public void remove() {
|
public void remove() {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
parent.remove(last.getKey());
|
parent.remove(last.getKey());
|
||||||
last = null;
|
last = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public K getKey() {
|
public K getKey() {
|
||||||
if (last == null) {
|
if (last == null) {
|
||||||
throw new IllegalStateException("Iterator getKey() can only be called after next() and before remove()");
|
throw new IllegalStateException(
|
||||||
|
"Iterator getKey() can only be called after next() and before remove()");
|
||||||
}
|
}
|
||||||
return last.getKey();
|
return last.getKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public V getValue() {
|
public V getValue() {
|
||||||
if (last == null) {
|
if (last == null) {
|
||||||
throw new IllegalStateException("Iterator getValue() can only be called after next() and before remove()");
|
throw new IllegalStateException(
|
||||||
|
"Iterator getValue() can only be called after next() and before remove()");
|
||||||
}
|
}
|
||||||
return last.getValue();
|
return last.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public V setValue(V value) {
|
public V setValue(V value) {
|
||||||
if (last == null) {
|
if (last == null) {
|
||||||
throw new IllegalStateException("Iterator setValue() can only be called after next() and before remove()");
|
throw new IllegalStateException(
|
||||||
|
"Iterator setValue() can only be called after next() and before remove()");
|
||||||
}
|
}
|
||||||
if (parent.reverseMap.containsKey(value) &&
|
if (parent.reverseMap.containsKey(value) &&
|
||||||
parent.reverseMap.get(value) != last.getKey()) {
|
parent.reverseMap.get(value) != last.getKey()) {
|
||||||
throw new IllegalArgumentException("Cannot use setValue() when the object being set is already in the map");
|
throw new IllegalArgumentException(
|
||||||
|
"Cannot use setValue() when the object being set is already in the map");
|
||||||
}
|
}
|
||||||
return parent.put(last.getKey(), value);
|
return parent.put(last.getKey(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
public void reset() {
|
public void reset() {
|
||||||
iterator = new ArrayList<Map.Entry<K, V>>(parent.entrySet()).listIterator();
|
iterator = new ArrayList<Map.Entry<K, V>>(parent.entrySet()).listIterator();
|
||||||
last = null;
|
last = null;
|
||||||
|
|
|
@ -31,7 +31,9 @@ import org.apache.commons.collections.OrderedIterator;
|
||||||
import org.apache.commons.collections.OrderedMapIterator;
|
import org.apache.commons.collections.OrderedMapIterator;
|
||||||
import org.apache.commons.collections.iterators.EmptyOrderedMapIterator;
|
import org.apache.commons.collections.iterators.EmptyOrderedMapIterator;
|
||||||
import org.apache.commons.collections.keyvalue.UnmodifiableMapEntry;
|
import org.apache.commons.collections.keyvalue.UnmodifiableMapEntry;
|
||||||
import static org.apache.commons.collections.bidimap.TreeBidiMap.DataElement.*;
|
|
||||||
|
import static org.apache.commons.collections.bidimap.TreeBidiMap.DataElement.KEY;
|
||||||
|
import static org.apache.commons.collections.bidimap.TreeBidiMap.DataElement.VALUE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Red-Black tree-based implementation of BidiMap where all objects added
|
* Red-Black tree-based implementation of BidiMap where all objects added
|
||||||
|
@ -55,7 +57,7 @@ import static org.apache.commons.collections.bidimap.TreeBidiMap.DataElement.*;
|
||||||
* {@link DualHashBidiMap} implementations use this approach.
|
* {@link DualHashBidiMap} implementations use this approach.
|
||||||
* <p>
|
* <p>
|
||||||
* This solution keeps minimizes the data storage by holding data only once.
|
* This solution keeps minimizes the data storage by holding data only once.
|
||||||
* The red-black algorithm is based on java util TreeMap, but has been modified
|
* The red-black algorithm is based on {@link java.util.TreeMap}, but has been modified
|
||||||
* to simultaneously map a tree node by key and by value. This doubles the
|
* to simultaneously map a tree node by key and by value. This doubles the
|
||||||
* cost of put operations (but so does using two TreeMaps), and nearly doubles
|
* cost of put operations (but so does using two TreeMaps), and nearly doubles
|
||||||
* the cost of remove operations (there is a savings in that the lookup of the
|
* the cost of remove operations (there is a savings in that the lookup of the
|
||||||
|
@ -68,11 +70,7 @@ import static org.apache.commons.collections.bidimap.TreeBidiMap.DataElement.*;
|
||||||
* UnsupportedOperationException on attempts to call that method.
|
* UnsupportedOperationException on attempts to call that method.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0 (previously DoubleOrderedMap v2.0)
|
* @since Commons Collections 3.0 (previously DoubleOrderedMap v2.0)
|
||||||
* @version $Revision$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Marc Johnson
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
* @author Matt Benson
|
|
||||||
*/
|
*/
|
||||||
public class TreeBidiMap<K extends Comparable<K>, V extends Comparable<V>> implements OrderedBidiMap<K, V> {
|
public class TreeBidiMap<K extends Comparable<K>, V extends Comparable<V>> implements OrderedBidiMap<K, V> {
|
||||||
|
|
||||||
|
@ -83,6 +81,8 @@ public class TreeBidiMap<K extends Comparable<K>, V extends Comparable<V>> imple
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new TreeBidiMap.DataElement.
|
* Create a new TreeBidiMap.DataElement.
|
||||||
|
*
|
||||||
|
* @param description the description for the element
|
||||||
*/
|
*/
|
||||||
private DataElement(String description) {
|
private DataElement(String description) {
|
||||||
this.description = description;
|
this.description = description;
|
||||||
|
|
|
@ -29,14 +29,12 @@ import org.apache.commons.collections.map.UnmodifiableEntrySet;
|
||||||
import org.apache.commons.collections.set.UnmodifiableSet;
|
import org.apache.commons.collections.set.UnmodifiableSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decorates another <code>BidiMap</code> to ensure it can't be altered.
|
* Decorates another {@link BidiMap} to ensure it can't be altered.
|
||||||
* <p>
|
* <p>
|
||||||
* Attempts to modify it will result in an UnsupportedOperationException.
|
* Attempts to modify it will result in an UnsupportedOperationException.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Revision$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public final class UnmodifiableBidiMap<K, V>
|
public final class UnmodifiableBidiMap<K, V>
|
||||||
extends AbstractBidiMapDecorator<K, V> implements Unmodifiable {
|
extends AbstractBidiMapDecorator<K, V> implements Unmodifiable {
|
||||||
|
@ -49,6 +47,8 @@ public final class UnmodifiableBidiMap<K, V>
|
||||||
* <p>
|
* <p>
|
||||||
* If the map passed in is already unmodifiable, it is returned.
|
* If the map passed in is already unmodifiable, it is returned.
|
||||||
*
|
*
|
||||||
|
* @param <K> the key type
|
||||||
|
* @param <V> the value type
|
||||||
* @param map the map to decorate, must not be null
|
* @param map the map to decorate, must not be null
|
||||||
* @return an unmodifiable BidiMap
|
* @return an unmodifiable BidiMap
|
||||||
* @throws IllegalArgumentException if map is null
|
* @throws IllegalArgumentException if map is null
|
||||||
|
|
|
@ -29,14 +29,12 @@ import org.apache.commons.collections.map.UnmodifiableEntrySet;
|
||||||
import org.apache.commons.collections.set.UnmodifiableSet;
|
import org.apache.commons.collections.set.UnmodifiableSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decorates another <code>OrderedBidiMap</code> to ensure it can't be altered.
|
* Decorates another {@link OrderedBidiMap} to ensure it can't be altered.
|
||||||
* <p>
|
* <p>
|
||||||
* Attempts to modify it will result in an UnsupportedOperationException.
|
* Attempts to modify it will result in an UnsupportedOperationException.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Revision$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public final class UnmodifiableOrderedBidiMap<K, V>
|
public final class UnmodifiableOrderedBidiMap<K, V>
|
||||||
extends AbstractOrderedBidiMapDecorator<K, V> implements Unmodifiable {
|
extends AbstractOrderedBidiMapDecorator<K, V> implements Unmodifiable {
|
||||||
|
@ -49,6 +47,8 @@ public final class UnmodifiableOrderedBidiMap<K, V>
|
||||||
* <p>
|
* <p>
|
||||||
* If the map passed in is already unmodifiable, it is returned.
|
* If the map passed in is already unmodifiable, it is returned.
|
||||||
*
|
*
|
||||||
|
* @param <K> the key type
|
||||||
|
* @param <V> the value type
|
||||||
* @param map the map to decorate, must not be null
|
* @param map the map to decorate, must not be null
|
||||||
* @return an unmodifiable OrderedBidiMap
|
* @return an unmodifiable OrderedBidiMap
|
||||||
* @throws IllegalArgumentException if map is null
|
* @throws IllegalArgumentException if map is null
|
||||||
|
|
|
@ -31,14 +31,12 @@ import org.apache.commons.collections.map.UnmodifiableSortedMap;
|
||||||
import org.apache.commons.collections.set.UnmodifiableSet;
|
import org.apache.commons.collections.set.UnmodifiableSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decorates another <code>SortedBidiMap</code> to ensure it can't be altered.
|
* Decorates another {@link SortedBidiMap} to ensure it can't be altered.
|
||||||
* <p>
|
* <p>
|
||||||
* Attempts to modify it will result in an UnsupportedOperationException.
|
* Attempts to modify it will result in an {@link UnsupportedOperationException}.
|
||||||
*
|
*
|
||||||
* @since Commons Collections 3.0
|
* @since Commons Collections 3.0
|
||||||
* @version $Revision$
|
* @version $Id$
|
||||||
*
|
|
||||||
* @author Stephen Colebourne
|
|
||||||
*/
|
*/
|
||||||
public final class UnmodifiableSortedBidiMap<K, V>
|
public final class UnmodifiableSortedBidiMap<K, V>
|
||||||
extends AbstractSortedBidiMapDecorator<K, V> implements Unmodifiable {
|
extends AbstractSortedBidiMapDecorator<K, V> implements Unmodifiable {
|
||||||
|
@ -51,6 +49,8 @@ public final class UnmodifiableSortedBidiMap<K, V>
|
||||||
* <p>
|
* <p>
|
||||||
* If the map passed in is already unmodifiable, it is returned.
|
* If the map passed in is already unmodifiable, it is returned.
|
||||||
*
|
*
|
||||||
|
* @param <K> the key type
|
||||||
|
* @param <V> the value type
|
||||||
* @param map the map to decorate, must not be null
|
* @param map the map to decorate, must not be null
|
||||||
* @return an unmodifiable SortedBidiMap
|
* @return an unmodifiable SortedBidiMap
|
||||||
* @throws IllegalArgumentException if map is null
|
* @throws IllegalArgumentException if map is null
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* This package contains implementations of the
|
||||||
|
* {@link org.apache.commons.collections.BidiMap BidiMap},
|
||||||
|
* {@link org.apache.commons.collections.OrderedBidiMap OrderedBidiMap} and
|
||||||
|
* {@link org.apache.commons.collections.SortedBidiMap SortedBidiMap} interfaces.
|
||||||
|
* A BidiMap is an extension to Map that allows keys and values to be looked up with equal ease.
|
||||||
|
* One example usage is a system communicating to a legacy datasource that must convert codes
|
||||||
|
* from the new format to the old format and vice versa.
|
||||||
|
* <p>
|
||||||
|
* The following implementations are provided in the package:
|
||||||
|
* <ul>
|
||||||
|
* <li>DualHashBidiMap - uses two HashMaps to implement BidiMap
|
||||||
|
* <li>DualTreeBidiMap - uses two TreeMaps to implement SortedBidiMap
|
||||||
|
* <li>TreeBidiMap - red-black tree implementation of OrderedBidiMap
|
||||||
|
* </ul>
|
||||||
|
* <p>
|
||||||
|
* The following decorators are provided in the package:
|
||||||
|
* <ul>
|
||||||
|
* <li>Unmodifiable - ensures the map cannot be altered
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
package org.apache.commons.collections.bidimap;
|
|
@ -1,48 +0,0 @@
|
||||||
<!-- $Id$ -->
|
|
||||||
<!--
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
(the "License"); you may not use this file except in compliance with
|
|
||||||
the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
<BODY>
|
|
||||||
<p>
|
|
||||||
This package contains implementations of the
|
|
||||||
{@link org.apache.commons.collections.BidiMap BidiMap},
|
|
||||||
{@link org.apache.commons.collections.OrderedBidiMap OrderedBidiMap} and
|
|
||||||
{@link org.apache.commons.collections.SortedBidiMap SortedBidiMap} interfaces.
|
|
||||||
A BidiMap is an extension to Map that allows keys and values to be looked up with equal ease.
|
|
||||||
One example usage is a system communicating to a legacy datasource that must convert codes
|
|
||||||
from the new format to the old format and vice versa.
|
|
||||||
<p>
|
|
||||||
The following implementations are provided in the package:
|
|
||||||
<ul>
|
|
||||||
<li>DualHashBidiMap - uses two HashMaps to implement BidiMap
|
|
||||||
<li>DualTreeBidiMap - uses two TreeMaps to implement SortedBidiMap
|
|
||||||
<li>TreeBidiMap - red-black tree implementation of OrderedBidiMap
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
The following decorators are provided in the package:
|
|
||||||
<ul>
|
|
||||||
<li>Unmodifiable - ensures the map cannot be altered
|
|
||||||
<!--
|
|
||||||
<li>Synchronized - synchronizes method access for multi-threaded environments
|
|
||||||
<li>Predicated - ensures that only elements that are valid according to a predicate can be added
|
|
||||||
<li>Typed - ensures that only elements that are of a specific type can be added
|
|
||||||
<li>Transformed - transforms each element added
|
|
||||||
<li>FixedSize - ensures that the size of the map cannot change
|
|
||||||
<li>Lazy - creates objects in the map on demand
|
|
||||||
<li>ListOrdered - ensures that insertion order is retained-->
|
|
||||||
</ul>
|
|
||||||
</pre>
|
|
||||||
</BODY>
|
|
Loading…
Reference in New Issue