Tabela hash - Problema com Chave duplicada

Tenho que fazer um trabalho onde tenho que ler um arquivo de pares de palavras. Só que pode haver a situação onde a primeira palavra pode vir em duas linhas. Quando tento mapear usando Hashtable ou Map não aceita dois mapeamentos com mesma chave.

Segue exemplo:

   	    Hashtable m1 = new Hashtable();
		
	    m1.put("A", "Um");
	    m1.put("B", "Dois");
	    m1.put("C", "Tres");
	    m1.put("B", "Quatro");

	    System.out.println(m1.toString());
	    //Saída: {A=Um, C=Tres, B=Quatro}
	    //"B" foi sobrescrevido

Alguem pode me indicar alguma direção ?

Obrigado!

E é justamente para isso que um HashMap serve.

A alternativa é você fazer um HashMap associado a um list.

[code]Map<String, List<String>&gt m1 = new HashMap<String, List><String>&gt();

List<String> linhas = m1.get(“A”);
if (linhas == null) {
linhas = new ArrayList<String>();
m1.put(“A”, linhas);
}

linhas.put(“UM”);[/code]

Assim, você cria um mapa que associa a palavra a uma lista de linhas. :slight_smile:

Em C++ há o template map&lt&gt (correspondente ao java.lang.TreeMap&lt&gt) e o template multimap&lt&gt (que não tem correspondente). O problema do multimap é que ele é um pouco "desajeitado". Comparando o multimap com o Map<String, List><String>&gt apresentado pelo Vinigodoy, prefiro a opção Java. Dou um exemplo depois.

Valeu pelas dicas pessoal!

Neste momento estou no trabalho e meu horário de almoço já acabou.

Assim que tiver oportunidade eu vou fazer os testes!

Caso eu encontre dificuldades eu passo para os próximos itens do trabalho, assim eu não fico parado em um problema sendo que o restante eu consigo fazer!

Abraço!

Eu concordo com você. Também não tenho uma experiência das melhores com o multimap. Outra coisa que acho legal das Collections em relação a STL é o fato delas respeitarem uma hierarquia lógica de classes. As do C++ são pouco relacionadas, até porque um dos objetivos dela (bem atingido por sinal) era ter uma performance absurdamente rápida, com o menor footprint possível.

As coisas esquisitas do multimap:

a) Você usa muito o template “pair” para representar uma estrutura de dados “chave, valor”.
b) Você tem que usar um método chamado “equal_range”, que volta um par de iteradores.
c) E só para deixar o exemplo um pouco mais enigmático: descubra as espécies de animais que usei para o exemplo. Wallabia bicolor é um simpático bichinho da Austrália (o wallaby), que lembra um canguru de brinquedo.

[code]
#include <map>
#include <string>
#include <iostream>
using namespace std;

typedef multimap<string,string> MMSS;
typedef pair<string,string> PAIR;

int main (int argc, char *argv[]) {
MMSS mmss;
//-- Inserindo no multimap
mmss.insert (PAIR (“Macropodidae”, “Aepyprymnus rufescens”));
mmss.insert (PAIR (“Macropodidae”, “Wallabia bicolor”));
mmss.insert (PAIR (“Macropodidae”, “Macropus agilis”));
mmss.insert (PAIR (“Edentata”, “Euphractus sexcinctus”));
mmss.insert (PAIR (“Didelphidae”, “Didelphis marsupialis”));
mmss.insert (PAIR (“Didelphidae”, “Philander opossum”));
mmss.insert (PAIR (“Didelphidae”, “Didelphis virginiana”));
//-- Listando o “multimap”. Isto é parecido com o seguinte código Java:
// for (Map.Entry<String,String> entry : mmss.entrySet()) {
// System.out.println (entry.getKey() + “,” + entry.getValue());
// }
// Você pode ver que o multimap é como se fosse um TreeMap <String, ArrayList ><String> &gt
cout &lt&lt “Listando o multimap” &lt&lt endl;
for (MMSS::const_iterator it = mmss.begin(); it != mmss.end(); ++it) {
cout &lt&lt it-&gt first &lt&lt “,” &lt&lt it-&gt second &lt&lt endl;
}
cout &lt&lt “.” &lt&lt endl;
//-- Listando os elementos da chave “Macropodidae”.
cout &lt&lt “Listando apenas os Macropodidae” &lt&lt endl;
pair<MMSS::const_iterator, MMSS::const_iterator> macropodidae = mmss.equal_range (“Macropodidae”);
for (MMSS::const_iterator it = macropodidae.first; it != macropodidae.second; ++it) {
cout &lt&lt it-&gt first &lt&lt “,” &lt&lt it-&gt second &lt&lt endl;
}
cout &lt&lt “.” &lt&lt endl;

}[/code]