Uma forma de realizar tal operação é utilizar o método entrySet() para obter um Set com as entradas do map e percorrer esse set verificando se o valor procurado está na entrada. Vale lembrar que várias chaves do mapa podem conter o mesmo valor e neste caso irá encontrar mais de uma chave que possua o valor.
O código abaixo ilustra como fazer isso no Java 5 ou superior. No java 1.4 pode-se utilizar o Iterator do entrySet e proceder de forma análoga.
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Teste {
public static void main(String[] args) {
Map<String, String> teste = new HashMap<String, String>();
teste.put("Teste", "V1");
teste.put("Teste2", "V2");
teste.put("Teste3", "V3");
teste.put("Teste4", "V4");
teste.put("Teste5", "V5");
// percorre o set de entradas do mapa
for (Entry<String, String> entrada : teste.entrySet()) {
// verifica se o valor procurado é igual ao valor da entrada
if ("V3".equals(entrada.getValue())) {
// se for imprime a chave do objeto
System.out.println(entrada.getKey());
}
}
}
}
Renata a minha dica é você usar o List para fazer isso, o mapa tem um metodo chamado .vales() que você pode criar uma ArrayList passando resultado do .values();
List<String> minhaLista = new ArrayList<String>(minhaHash.values());
String valor = minhaLista.get(minhaLista.indexOf(valor));
Agora você tem que ter cuidado com o retorno do método indexOf, pois se vier menor que zero é porque o valor não existe dentro da sua coleção de valores, antes de usar o get() do ArrayList testa se é maior ou igual a zero.
No meu caso, estou priorizando o uso de Hash pq preciso de performace.
Então, no fim das contas, encontramos um artigo que explicava que a melhor alternativa pra performace nesse caso é usar duas Hashs. Entao eu tenho o seguinte:
Quando eu adiciono o conteúdo em uma, eu tb. adiciono na outra, e desta forma posso tanto pegar o Integer tendo o Component como pegar o Component tendo o Integer.