A desvantagem dessa abordagem é que você precisa escrever muito código da placa de caldeira para todas essas classes de contêineres muito simples.
3. Usando uma tupla
// you'll have to write or download a Tuple class in Java, (.NET ships with one)// create our mapMap<String,Tuple2<Person,Person> peopleByForename =newHashMap<>();// populate it
peopleByForename.put("Bob",newTuple2(newPerson("Bob Smith",newPerson("Bob Jones"));// read from itTuple<Person,Person> bobs = peopleByForename["Bob"];Person bob1 = bobs.Item1;Person bob2 = bobs.Item2;
A desvantagem desta solução é que não é óbvio que os dois mapas estão relacionados; um erro programático pode fazer com que os dois mapas fiquem fora de sincronia.
@ Jon, você poderia fornecer witha exemplo de trabalho em Java para a pergunta acima Perguntado por OP.Highly apreciado se você poderia postá-lo
Deepak
2
@Deepak: pesquise exemplos de multimapas de goiaba e você encontrará um código de amostra.
Jon Skeet
1
@Deepak: Basicamente, você constrói algo como ArrayListMultimapvocê ... ou simplesmente usa um HashMap<String, List<Integer>>ou o que quer. Você precisaria criar uma lista vazia sempre que um valor fosse adicionado pela primeira vez, basicamente.
Jon Skeet
1
você tem um exemplo de trabalho paraHashMap<String, List<Integer>>
Deepak
9
@ Deepak: Eu sugiro que você tente criar um exemplo, e se você ficar preso, faça uma pergunta, incluindo o código, na medida do possível. Você aprenderá muito mais dessa maneira.
Jon Skeet
23
Outra boa opção é usar o MultiValuedMap do Apache Commons. Dê uma olhada nas Classes de implementação conhecidas na parte superior da página para implementações especializadas.
Dê uma olhada nas Multimapbibliotecas da goiaba e sua implementação -HashMultimap
Uma coleção semelhante a um mapa, mas que pode associar vários valores a uma única chave. Se você chamar put (K, V) duas vezes, com a mesma chave, mas com valores diferentes, o multimapa conterá mapeamentos da chave para os dois valores.
eu uso Map<KeyType, Object[]> para associar vários valores a uma chave em um mapa. Dessa forma, eu posso armazenar vários valores de diferentes tipos associados a uma chave. Você deve tomar cuidado, mantendo a ordem correta de inserção e recuperação de Object [].
Exemplo: considere, queremos armazenar informações do aluno. A chave é id, enquanto gostaríamos de armazenar o nome, endereço e e-mail associado ao aluno.
//To make entry into MapMap<Integer,String[]> studenMap =newHashMap<Integer,String[]>();String[] studentInformationArray =newString[]{"name","address","email"};int studenId =1;
studenMap.put(studenId, studentInformationArray);//To retrieve values from MapString name = studenMap.get(studenId)[1];String address = studenMap.get(studenId)[2];String email = studenMap.get(studenId)[3];
Observe que, para garantir consistência, caso vários threads acessem essa estrutura de dados ConcurrentHashMape , CopyOnWriteArrayListpor exemplo, precisem ser usados.
A maneira mais fácil seria usar uma biblioteca de coleções do Google:
import com.google.common.collect.ArrayListMultimap;import com.google.common.collect.Multimap;publicclassTest{publicstaticvoid main(finalString[] args){// multimap can handle one key with a list of valuesfinalMultimap<String,String> cars =ArrayListMultimap.create();
cars.put("Nissan","Qashqai");
cars.put("Nissan","Juke");
cars.put("Bmw","M3");
cars.put("Bmw","330E");
cars.put("Bmw","X6");
cars.put("Bmw","X5");
cars.get("Bmw").forEach(System.out::println);// It will print the:// M3// 330E// X6// X5}}
// Create the map. There is no restriction to the size that the array String can haveHashMap<Integer,String[]> map =newHashMap<Integer,String[]>();//initialize a key chosing the array of String you want for your values
map.put(1,newString[]{"name1","name2"});//edit value of a key
map.get(1)[0]="othername";
Isso é muito simples e eficaz. Se você deseja valores de classes diferentes, pode fazer o seguinte:
Estou tão acostumado a fazer isso com um Dicionário de dados no Objetivo C. Foi mais difícil obter um resultado semelhante no Java para Android. Acabei criando uma classe personalizada e depois fazendo um mapa de hash da minha classe personalizada.
publicclassTest1{@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.addview);//create the datastringHashMap<Integer, myClass> hm =newHashMap<Integer, myClass>();
hm.put(1,new myClass("Car","Small",3000));
hm.put(2,new myClass("Truck","Large",4000));
hm.put(3,new myClass("Motorcycle","Small",1000));//pull the datastring back for a specific item.//also can edit the data using the set methods. this just shows getting it for display.
myClass test1 = hm.get(1);String testitem = test1.getItem();int testprice = test1.getPrice();Log.i("Class Info Example",testitem+Integer.toString(testprice));}}//custom class. You could make it public to use on several activities, or just include in the activity if using only hereclass myClass{privateString item;privateString type;privateint price;public myClass(String itm,String ty,int pr){this.item = itm;this.price = pr;this.type = ty;}publicString getItem(){return item;}publicvoid setItem(String item){this.item = item;}publicString getType(){return item;}publicvoid setType(String type){this.type = type;}publicint getPrice(){return price;}publicvoid setPrice(int price){this.price = price;}}
Podemos criar uma classe para ter várias chaves ou valores e o objeto dessa classe pode ser usado como parâmetro no mapa. Você pode consultar https://stackoverflow.com/a/44181931/8065321
Respostas:
Você poderia:
Map<KeyType, List<ValueType>>
.Map<KeyType, WrapperType>
.Map<KeyType, Tuple<Value1Type, Value2Type>>
.Exemplos
1. Mapa com lista como o valor
A desvantagem dessa abordagem é que a lista não está vinculada exatamente a dois valores.
2. Usando a classe wrapper
A desvantagem dessa abordagem é que você precisa escrever muito código da placa de caldeira para todas essas classes de contêineres muito simples.
3. Usando uma tupla
Esta é a melhor solução na minha opinião.
4. Vários mapas
A desvantagem desta solução é que não é óbvio que os dois mapas estão relacionados; um erro programático pode fazer com que os dois mapas fiquem fora de sincronia.
fonte
Map<KeyType, Tuple<Value1Type, Value2Type>>
Não, não apenas como
HashMap
. Você precisaria basicamenteHashMap
de uma chave para uma coleção de valores.Se você gosta de usar bibliotecas externas, o Guava tem exatamente esse conceito em
Multimap
implementações comoArrayListMultimap
eHashMultimap
.fonte
ArrayListMultimap
você ... ou simplesmente usa umHashMap<String, List<Integer>>
ou o que quer. Você precisaria criar uma lista vazia sempre que um valor fosse adicionado pela primeira vez, basicamente.HashMap<String, List<Integer>>
Outra boa opção é usar o MultiValuedMap do Apache Commons. Dê uma olhada nas Classes de implementação conhecidas na parte superior da página para implementações especializadas.
Exemplo:
poderia ser substituído por
Assim,
resultaria em uma coleção
coll
contendo "A", "B" e "C".fonte
Dê uma olhada nas
Multimap
bibliotecas da goiaba e sua implementação -HashMultimap
fonte
eu uso
Map<KeyType, Object[]>
para associar vários valores a uma chave em um mapa. Dessa forma, eu posso armazenar vários valores de diferentes tipos associados a uma chave. Você deve tomar cuidado, mantendo a ordem correta de inserção e recuperação de Object [].Exemplo: considere, queremos armazenar informações do aluno. A chave é id, enquanto gostaríamos de armazenar o nome, endereço e e-mail associado ao aluno.
fonte
fonte
Apenas para constar, a solução JDK8 pura seria usar o
Map::compute
método:Tal como
com saída:
Observe que, para garantir consistência, caso vários threads acessem essa estrutura de dados
ConcurrentHashMap
e ,CopyOnWriteArrayList
por exemplo, precisem ser usados.fonte
computeIfAbsent
.map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
Se você usa o Spring Framework . Há sim:
org.springframework.util.MultiValueMap
.Para criar um mapa de múltiplos valores não modificável:
Ou use
org.springframework.util.LinkedMultiValueMap
fonte
Sim e não. A solução é criar um clas Wrapper para seus valores que contenha os 2 (3 ou mais) valores que correspondem à sua chave.
fonte
Sim, isso costuma ser chamado de
multimap
.Consulte: http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html
fonte
A maneira mais fácil seria usar uma biblioteca de coleções do Google:
link da maven: https://mvnrepository.com/artifact/com.google.collections/google-collections/1.0-rc2
mais sobre isso: http://tomjefferys.blogspot.be/2011/09/multimaps-google-guava.html
fonte
Eu tenho os melhores resultados.
Você apenas tem que criar novos
HashMap
comono seu
for
loop. Terá o mesmo efeito que a mesma chave e vários valores.fonte
Resultado:
Esta é a biblioteca Google-Guava para funcionalidades de utilitários. Esta é a solução necessária.
fonte
Não consegui postar uma resposta no comentário de Paul, por isso estou criando um novo comentário para Vidhya aqui:
O wrapper será um
SuperClass
para as duas classes que queremos armazenar como um valor.e dentro da classe wrapper, podemos colocar as associações como objetos de variável de instância para os dois objetos de classe.
por exemplo
e no HashMap , podemos colocar dessa maneira,
WrapperObj terá variáveis de classe:
class1Obj, class2Obj
fonte
Você pode fazer isso implicitamente.
Isso é muito simples e eficaz. Se você deseja valores de classes diferentes, pode fazer o seguinte:
fonte
Pode ser feito usando um identityHashMap, sujeito à condição de que a comparação de chaves seja feita pelo operador == e não seja igual a ().
fonte
Eu prefiro o seguinte para armazenar qualquer número de variáveis sem precisar criar uma classe separada.
fonte
Estou tão acostumado a fazer isso com um Dicionário de dados no Objetivo C. Foi mais difícil obter um resultado semelhante no Java para Android. Acabei criando uma classe personalizada e depois fazendo um mapa de hash da minha classe personalizada.
fonte
Podemos criar uma classe para ter várias chaves ou valores e o objeto dessa classe pode ser usado como parâmetro no mapa. Você pode consultar https://stackoverflow.com/a/44181931/8065321
fonte
Usando Java Collectors
onde o departamento é sua chave
fonte
Experimente o LinkedHashMap , exemplo:
resultado:
fonte
linked
não existirá mais no mapa porque você o substituiuhash
.