2017-09-29 1 views
2

Je dois avoir une carte entre deux types d'objets, disons, à des fins de démonstration, String et Long.Java HashMap inverse way

Je sais que HashMap a un O (1) les performances de recherche, ce qui est génial. Je me sers quelque chose comme ceci:

HashMap<String, Long> a = new HashMap<String, Long>(); 

Cela fonctionne très bien quand je veux rechercher par la clé. Cependant, maintenant je dois aussi trouver la clé en cherchant par valeur.

Si je commence à itérer sur les touches, alors je vais perdre la performance.

La première option que j'ai pensé est de créer une autre HashMap l'inverse.

HashMap<Long, String> reverseA = new HashMap<Long, String>(); 

Et chaque fois que j'écris dans un, écrivez dans l'autre.

est-il pas une classe spécifique pour être en mesure de rechercher par des clés et des valeurs, avec cette grande performance?

Dois-je créer ma propre classe avec les deux HashMaps?

Une autre solution?

+0

Peut-être goyave de [BiMap] (https://github.com/google/guava/wiki/NewCollectionTypesExplained # bimap) contient ce que vous cherchez. – Henrik

+0

Mais bien sûr, la clé est unique et la valeur n'est peut-être pas –

+0

@ScaryWombat: Eh bien, si la carte 'reverseA' est une option, alors les valeurs seront mieux uniques ou il y aura un peu d'inconsistance. – Henrik

Répondre

5

Vous pouvez utiliser Goyave BiMap:

BiMap<String, Long> map = HashBiMap.create(); 
map.put("a", 1L); 
map.put("b", 2L); 
map.put("c", 3L); 

System.out.println(map.get("b")); // 2L 
System.out.println(map.inverse().get(2L)); // "b" 

Une autre alternative est Apache commons BidiMap:

BidiMap<String, Long> map = new DualHashBidiMap<>(); 
map.put("a", 1L); 
map.put("b", 2L); 
map.put("c", 3L); 

System.out.println(map.get("b")); // 2L 
System.out.println(map.inverseBidiMap().get(2L)); // "b" 
0

Java lui-même ne propose rien, mais Goyave a BiMap, qui a une vue inverse qui prend en charge inverse efficaces lookups.