A
Map
implementation that uses multiple keys to map the value.
This class is the most efficient way to uses multiple keys to map to a value.
The best way to use this class is via the additional map-style methods.
These provide
get
,
containsKey
,
put
and
remove
for individual keys which operate without extra object creation.
The additional methods are the main interface of this map.
As such, you will not normally hold this map in a variable of type
Map
.
The normal map methods take in and return a
MultiKey
.
If you try to use
put()
with any other object type a
ClassCastException
is thrown. If you try to use
null
as
the key in
put()
a
NullPointerException
is thrown.
This map is implemented as a decorator of a
AbstractHashedMap
which
enables extra behaviour to be added easily.
MultiKeyMap.decorate(new LinkedMap())
creates an ordered map.
MultiKeyMap.decorate(new LRUMap())
creates an least recently used map.
MultiKeyMap.decorate(new ReferenceMap())
creates a garbage collector sensitive map.
Note that
IdentityMap
and
ReferenceIdentityMap
are unsuitable
for use as the key comparison would work on the whole MultiKey, not the elements within.
As an example, consider a least recently used cache that uses a String airline code
and a Locale to lookup the airline's name:
private MultiKeyMap cache = MultiKeyMap.decorate(new LRUMap(50));
public String getAirlineName(String code, String locale) {
String name = (String) cache.get(code, locale);
if (name == null) {
name = getAirlineNameFromDB(code, locale);
cache.put(code, locale, name);
}
return name;
}
checkKey
protected void checkKey(Object key)
Check to ensure that input keys are valid MultiKey objects.
clone
public Object clone()
Clones the map without cloning the keys or values.
containsKey
public boolean containsKey(Object key)
containsKey
public boolean containsKey(Object key1,
Object key2)
Checks whether the map contains the specified multi-key.
key1
- the first keykey2
- the second key
- true if the map contains the key
containsKey
public boolean containsKey(Object key1,
Object key2,
Object key3)
Checks whether the map contains the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third key
- true if the map contains the key
containsKey
public boolean containsKey(Object key1,
Object key2,
Object key3,
Object key4)
Checks whether the map contains the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth key
- true if the map contains the key
containsKey
public boolean containsKey(Object key1,
Object key2,
Object key3,
Object key4,
Object key5)
Checks whether the map contains the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth keykey5
- the fifth key
- true if the map contains the key
containsValue
public boolean containsValue(Object value)
decorate
public static MultiKeyMap decorate(AbstractHashedMap map)
Decorates the specified map to add the MultiKeyMap API and fast query.
The map must not be null and must be empty.
map
- the map to decorate, not null
entrySet
public Set entrySet()
equals
public boolean equals(Object obj)
get
public Object get(Object key)
get
public Object get(Object key1,
Object key2)
Gets the value mapped to the specified multi-key.
key1
- the first keykey2
- the second key
- the mapped value, null if no match
get
public Object get(Object key1,
Object key2,
Object key3)
Gets the value mapped to the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third key
- the mapped value, null if no match
get
public Object get(Object key1,
Object key2,
Object key3,
Object key4)
Gets the value mapped to the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth key
- the mapped value, null if no match
get
public Object get(Object key1,
Object key2,
Object key3,
Object key4,
Object key5)
Gets the value mapped to the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth keykey5
- the fifth key
- the mapped value, null if no match
hash
protected int hash(Object key1,
Object key2)
Gets the hash code for the specified multi-key.
key1
- the first keykey2
- the second key
hash
protected int hash(Object key1,
Object key2,
Object key3)
Gets the hash code for the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third key
hash
protected int hash(Object key1,
Object key2,
Object key3,
Object key4)
Gets the hash code for the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth key
hash
protected int hash(Object key1,
Object key2,
Object key3,
Object key4,
Object key5)
Gets the hash code for the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth keykey5
- the fifth key
hashCode
public int hashCode()
isEmpty
public boolean isEmpty()
isEqualKey
protected boolean isEqualKey(AbstractHashedMap.HashEntry entry,
Object key1,
Object key2)
Is the key equal to the combined key.
entry
- the entry to compare tokey1
- the first keykey2
- the second key
isEqualKey
protected boolean isEqualKey(AbstractHashedMap.HashEntry entry,
Object key1,
Object key2,
Object key3)
Is the key equal to the combined key.
entry
- the entry to compare tokey1
- the first keykey2
- the second keykey3
- the third key
isEqualKey
protected boolean isEqualKey(AbstractHashedMap.HashEntry entry,
Object key1,
Object key2,
Object key3,
Object key4)
Is the key equal to the combined key.
entry
- the entry to compare tokey1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth key
isEqualKey
protected boolean isEqualKey(AbstractHashedMap.HashEntry entry,
Object key1,
Object key2,
Object key3,
Object key4,
Object key5)
Is the key equal to the combined key.
entry
- the entry to compare tokey1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth keykey5
- the fifth key
keySet
public Set keySet()
mapIterator
public MapIterator mapIterator()
Obtains a
MapIterator
over the map.
A map iterator is an efficient way of iterating over maps.
There is no need to access the entry set or cast to Map Entry objects.
IterableMap map = new HashedMap();
MapIterator it = map.mapIterator();
while (it.hasNext()) {
Object key = it.next();
Object value = it.getValue();
it.setValue("newValue");
}
- mapIterator in interface IterableMap
put
public Object put(Object key,
Object value)
Puts the key and value into the map, where the key must be a non-null
MultiKey object.
key
- the non-null MultiKey objectvalue
- the value to store
- the previous value for the key
put
public Object put(Object key1,
Object key2,
Object value)
Stores the value against the specified multi-key.
key1
- the first keykey2
- the second keyvalue
- the value to store
- the value previously mapped to this combined key, null if none
put
public Object put(Object key1,
Object key2,
Object key3,
Object value)
Stores the value against the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keyvalue
- the value to store
- the value previously mapped to this combined key, null if none
put
public Object put(Object key1,
Object key2,
Object key3,
Object key4,
Object value)
Stores the value against the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth keyvalue
- the value to store
- the value previously mapped to this combined key, null if none
put
public Object put(Object key1,
Object key2,
Object key3,
Object key4,
Object key5,
Object value)
Stores the value against the specified multi-key.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth keykey5
- the fifth keyvalue
- the value to store
- the value previously mapped to this combined key, null if none
putAll
public void putAll(Map mapToCopy)
Puts all the keys and values into this map.
Each key must be non-null and a MultiKey object.
remove
public Object remove(Object key)
remove
public Object remove(Object key1,
Object key2)
Removes the specified multi-key from this map.
key1
- the first keykey2
- the second key
- the value mapped to the removed key, null if key not in map
remove
public Object remove(Object key1,
Object key2,
Object key3)
Removes the specified multi-key from this map.
key1
- the first keykey2
- the second keykey3
- the third key
- the value mapped to the removed key, null if key not in map
remove
public Object remove(Object key1,
Object key2,
Object key3,
Object key4)
Removes the specified multi-key from this map.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth key
- the value mapped to the removed key, null if key not in map
remove
public Object remove(Object key1,
Object key2,
Object key3,
Object key4,
Object key5)
Removes the specified multi-key from this map.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth keykey5
- the fifth key
- the value mapped to the removed key, null if key not in map
removeAll
public boolean removeAll(Object key1)
Removes all mappings where the first key is that specified.
This method removes all the mappings where the
MultiKey
has one or more keys, and the first matches that specified.
- true if any elements were removed
removeAll
public boolean removeAll(Object key1,
Object key2)
Removes all mappings where the first two keys are those specified.
This method removes all the mappings where the
MultiKey
has two or more keys, and the first two match those specified.
key1
- the first keykey2
- the second key
- true if any elements were removed
removeAll
public boolean removeAll(Object key1,
Object key2,
Object key3)
Removes all mappings where the first three keys are those specified.
This method removes all the mappings where the
MultiKey
has three or more keys, and the first three match those specified.
key1
- the first keykey2
- the second keykey3
- the third key
- true if any elements were removed
removeAll
public boolean removeAll(Object key1,
Object key2,
Object key3,
Object key4)
Removes all mappings where the first four keys are those specified.
This method removes all the mappings where the
MultiKey
has four or more keys, and the first four match those specified.
key1
- the first keykey2
- the second keykey3
- the third keykey4
- the fourth key
- true if any elements were removed
toString
public String toString()
values
public Collection values()