[RESOLVIDO] Como recuperar valor através de duas chaves distintas?

Olá, primeiramente gostaria de pedir de desculpas caso já exista algum tópico igual ao meu, mas pelo que procurei (e procurei bastante), só existem tópicos semelhantes, mas não iguais.

O meu problema é o seguinte, estou fazendo um Compilador, como um projeto para a faculdade.
Estou na parte do Analisador Léxico, e como vocês devem saber, devo implementar uma tabela de símbolos.

No caso a tabela de símbolos teria que ter um índice, o valor do símbolo (o símbolo em si), e o tipo do símbolo.

O que eu gostaria de fazer, é utilizar alguma estrutura que me permitisse armazenar esses três valores (índice, símbolo e tipo), e depois eu pudesse recuperar os valores, tanto através do índice, quanto através do símbolo.
Resumindo: Gostaria de, se buscasse através de índice, que fossem retornados símbolo e tipo. Porém, se buscasse através do símbolo, que fossem retornados índice e tipo.

Basicamente, seria como um HashMap, mas com a possibilidade de recuperar pelo índice também.

Desde já, obrigado.

Foda…
Isso aí seria fácil se fosse com banco de dados.
Eu até iria dizer pra usar uma implementação de um Map de duas chaves q eu fiz, mas pelo q vc disse, ao passar qualquer valor deve ser retornado os outros, neste caso não serviria.

edit: Só pra exemplificar, com o Map q eu fiz, vc cria TwoKeyMap<Chave1, Chave2, Valor>… aí pra recuperar a Chave2 e o Valor, é só passar a Chave1. Para recuperar o Valor é só passar a Chave1 e a Chave2.

Obrigado por responder.

Pois é, a única solução que eu consigo pensar é usando banco de dados mesmo.
Apesar de que seria um pouco de desperdício, já que não preciso manter os dados depois do fechamento do programa.

Enfim, continuo pesquisando aqui alguma alternativa.

Fala brow,

Acho que eh meio gambiarra, mas e se voce usar 2 HashMaps?
Um com chaves de indices, outra com chaves do conteudo (sendo que estes nao se repitam)…

Abraco!

Obrigado pelas respostas.
Já consegui resolver o problema, vou tentar explicar como fiz:

Primeiro criei uma classe Simbolo:

[code]public class Simbolo {

private int indice;
private String simbolo;
private String tipo;

public Simbolo(int indiceParam, String simboloParam, String tipoParam) {
    indice = indiceParam;
    simbolo = simboloParam;
    tipo = tipoParam;
}

//aqui tem os getters e setters das variáveis
}[/code]

Depois criei uma classe personalizada, que permitia fazer a consulta e comparação, além de adicionar um símbolo (ou seja, funciona quase que como um banco de dados), segue:

[code]public class TabelaDeSimbolos {

private ArrayList<Simbolo> simbolos;

public TabelaDeSimbolos() {
    simbolos = new ArrayList<Simbolo>();
}

public Simbolo getSimbolo(int indice) {
    for (int i = 0; i < simbolos.size(); i++) {
        if (simbolos.get(i).getIndice() == indice) {
            return simbolos.get(i);
        }
    }
    return null;
}

public Simbolo getSimbolo(String simbolo) {
    for (int i = 0; i < simbolos.size(); i++) {
        if (simbolos.get(i).getSimbolo().equals(simbolo)) {
            return simbolos.get(i);
        }
    }
    return null;
}

public void add(Simbolo simbolo) {
    simbolos.add(simbolo);
}

}[/code]

Aqui a classe de teste:

[code]public class Programa {

public static void main(String args[]) {
    TabelaDeSimbolos tabelaDeSimbolos = new TabelaDeSimbolos();
    tabelaDeSimbolos.add(new Simbolo(1, "Símbolo 1", "Tipo 1"));
    tabelaDeSimbolos.add(new Simbolo(2, "Símbolo 2", "Tipo 2"));
    System.out.println(tabelaDeSimbolos.getSimbolo("Símbolo 1").getIndice());
    System.out.println(tabelaDeSimbolos.getSimbolo(2).getSimbolo());
}

}[/code]

Espero que isso possa ajudar alguém no futuro. ;D

Você poderia usar o FastMap do Javolution