This question already has an answer here:
I need a data structure which behaves like a Map,
but uses multiple (differently-typed) keys to access its values.
(Let's not be too general, let's say two keys)
Keys are guaranteed to be unique.
Something like:
MyMap<K1,K2,V> ...
With methods like:
getByKey1(K1 key)...
getByKey2(K2 key)...
containsKey1(K1 key)...
containsKey2(K2 key)...
Do you have any suggestions?
The only thing I can think of is:
Write a class which uses two Maps internally.
EDIT
Some people suggest me to use a tuple, a pair, or similar as a key for
Java's Map, but this would not work for me:
I have to be able, as written above, to search values by only one of the two keys specified.
Maps use hash codes of keys and check for their equality.
Another possile solution providing the possibility of more complicated keys can be found here: http://insidecoffe.blogspot.de/2013/04/indexable-hashmap-implementation.html
How about something like this:
His statement says that keys are Unique, so saving the same value objects against different keys is quite possible and when you send any key matching the said value, we would be able to get back to the value object.
See code below:
A value Object Class,
The result is:
Depending on how it will be used, you can either do this with two maps
Map<K1, V>
andMap<K2, V>
or with two mapsMap<K1, V>
andMap<K2, K1>
. If one of the keys is more permanent than the other, the second option may make more sense.Two maps. One
Map<K1, V>
and oneMap<K2, V>
. If you must have a single interface, write a wrapper class that implements said methods.all multy key's probably fail, cause the put([key1, key2], val) and the get([null, key2]) end up using the equals of [key1, key2] and [null, key2]. If the backing map doesnt contains hash buckets per key then lookups are real slow to.
i think the way to go is using a index decorator (see the key1, key2 examples above) and if the extra index key's are properties of the stored value you can use the property name's and reflection to build the secondairy maps when you put(key, val) and add an extra method get(propertyname, propertyvalue) to use that index.
the return type of the get(propertyname, propertyvalue) could be a Collection so even none unique key's are indexed....
If you intend to use combination of several keys as one, then perhaps apache commnons MultiKey is your friend. I don't think it would work one by one though..