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.
How about using a trie data structure ?
http://en.wikipedia.org/wiki/Trie
The root of the trie will by blank. The first level siblings will be your primary keys of the map, the second level siblings will be your secondary keys and the third level will be the terminal nodes which will have the value along will null to indicate termination of that branch. You can also add more than two keys using the same scheme.
Look up is simple DFS.
I created this to solve a similar issue.
Datastructure
Retrieve a value:
(Note* Cast the Object back to the inserted type. In my case it was my Event Object)
Inserting
Both MultiMap or MultiKeyMap from Commons or Guava will work.
However, a quick and simple solution could be to extend Map class buy handling a composite key yourself, considering that keys are of primitive type.
Yet another solution is to use Google's Guava
The usage is really simple:
The method
HashBasedTable.create()
is basically doing something like this:if you're trying to create some custom maps, you should go for the second option (as @Karatheodory suggests) otherwise you should be fine with the first one.
sol: cancatenate both keys and make a final key, use this as key.
for key values ,
concatenate ket-1, and key-2 with a come " , " in beetween, use this as original key.
key = key-1 + "," + key-2;
myMap.put(key,value);
similarly while retriving values.
I would suggest the structure
although searching for the second key might not be efficient