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.
Proposal, as suggested by some answerers:
See Google Collections. Or, as you suggest, use a map internally, and have that map use a Pair. You'll have to write or find Pair<>; it's pretty easy but not part of the standard Collections.
If keys are unique then there is no need for 2 maps, map of maps, mapOfWhateverThereIs. There needs to be only 1 single map and just a simple wrapper method that would put your keys and value into that map. Example:
Then use your map as you normally would. You don't even need those fancy getByKeyN and containsKeyN.
Sounds like your solution is quite plausible for this need, I honestly don't see a problem with it if your two key types are really distinct. Just makes ure you write your own implementation for this and deal with synchronization issues if needed.
A dirty and a simple solution, if you use the maps just for sorting lets say, is to add a very small value to a key until the value does not exist, but do not add the minimum (for example Double.MIN_VALUE) because it will cause a bug. Like I said, this is a very dirty solution but it makes the code simpler.
What about you declare the following "Key" class:
Declaring the Map
Declaring the key object
Filling the map
Getting the object from the map