La desventaja de este enfoque es que debe escribir mucho código de placa de caldera para todas estas clases de contenedores muy simples.
3. Usando una 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;
La desventaja de esta solución es que no es obvio que los dos mapas estén relacionados, un error programático podría hacer que los dos mapas no estén sincronizados.
@ Jon, ¿podría proporcionar un ejemplo de trabajo en Java para la pregunta anterior formulada por OP? Le agradezco mucho si pudiera publicarlo
Deepak
2
@Deepak: busque ejemplos de múltiples mapas de guayaba y encontrará un código de muestra.
Jon Skeet
1
@Deepak: Básicamente construirías algo como ArrayListMultimaptú ... o simplemente usarías una HashMap<String, List<Integer>>o lo que sea. Tendría que crear una lista vacía cada vez que se agrega un valor por primera vez, básicamente.
Jon Skeet
1
¿tiene un ejemplo de trabajo paraHashMap<String, List<Integer>>
Deepak
9
@Deepak: le sugiero que intente crear un ejemplo usted mismo y, si se atasca, haga una pregunta que incluya el código hasta donde tenga. Aprenderás mucho más de esa manera.
Jon Skeet
23
Otra buena opción es usar MultiValuedMap de Apache Commons. Eche un vistazo a Todas las clases de implementación conocidas en la parte superior de la página para implementaciones especializadas.
Eche un vistazo a Multimaplas bibliotecas de guayaba y su implementación:HashMultimap
Una colección similar a un Mapa, pero que puede asociar múltiples valores con una sola clave. Si llama a put (K, V) dos veces, con la misma clave pero con valores diferentes, el mapa múltiple contiene asignaciones de la clave a ambos valores.
Lo uso Map<KeyType, Object[]>para asociar múltiples valores con una clave en un mapa. De esta manera, puedo almacenar múltiples valores de diferentes tipos asociados con una clave. Debe tener cuidado manteniendo el orden adecuado de inserción y recuperación desde el Objeto [].
Ejemplo: considere, queremos almacenar información del estudiante. La clave es id, mientras que nos gustaría almacenar el nombre, la dirección y el correo electrónico asociados al estudiante.
//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];
Tenga en cuenta que para garantizar la coherencia en caso de múltiples subprocesos tienen acceso a esta estructura de datos, ConcurrentHashMapy CopyOnWriteArrayList, por ejemplo, necesidad de ser utilizado.
La forma más fácil sería usar una biblioteca de colección de 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";
Esto es muy simple y efectivo. Si desea valores de diferentes clases, puede hacer lo siguiente:
Estoy tan acostumbrado a hacer esto con un Diccionario de datos en el Objetivo C. Fue más difícil obtener un resultado similar en Java para Android. Terminé creando una clase personalizada y luego haciendo un hashmap de mi clase 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 crear una clase para tener múltiples claves o valores y el objeto de esta clase se puede usar como parámetro en el mapa. Puede consultar https://stackoverflow.com/a/44181931/8065321
Respuestas:
Tú podrías:
Map<KeyType, List<ValueType>>
.Map<KeyType, WrapperType>
.Map<KeyType, Tuple<Value1Type, Value2Type>>
.Ejemplos
1. Mapa con la lista como valor
La desventaja de este enfoque es que la lista no está vinculada exactamente a dos valores.
2. Usando la clase wrapper
La desventaja de este enfoque es que debe escribir mucho código de placa de caldera para todas estas clases de contenedores muy simples.
3. Usando una tupla
Esta es la mejor solución en mi opinión.
4. Múltiples mapas
La desventaja de esta solución es que no es obvio que los dos mapas estén relacionados, un error programático podría hacer que los dos mapas no estén sincronizados.
fuente
Map<KeyType, Tuple<Value1Type, Value2Type>>
No, no solo como un
HashMap
. Básicamente, necesitaría unaHashMap
clave a una colección de valores.Si está contento de usar bibliotecas externas, Guava tiene exactamente este concepto
Multimap
con implementaciones comoArrayListMultimap
yHashMultimap
.fuente
ArrayListMultimap
tú ... o simplemente usarías unaHashMap<String, List<Integer>>
o lo que sea. Tendría que crear una lista vacía cada vez que se agrega un valor por primera vez, básicamente.HashMap<String, List<Integer>>
Otra buena opción es usar MultiValuedMap de Apache Commons. Eche un vistazo a Todas las clases de implementación conocidas en la parte superior de la página para implementaciones especializadas.
Ejemplo:
podría ser reemplazado con
Entonces,
daría como resultado una colección que
coll
contiene "A", "B" y "C".fuente
Eche un vistazo a
Multimap
las bibliotecas de guayaba y su implementación:HashMultimap
fuente
Lo uso
Map<KeyType, Object[]>
para asociar múltiples valores con una clave en un mapa. De esta manera, puedo almacenar múltiples valores de diferentes tipos asociados con una clave. Debe tener cuidado manteniendo el orden adecuado de inserción y recuperación desde el Objeto [].Ejemplo: considere, queremos almacenar información del estudiante. La clave es id, mientras que nos gustaría almacenar el nombre, la dirección y el correo electrónico asociados al estudiante.
fuente
fuente
Solo para el registro, la solución JDK8 pura sería utilizar el
Map::compute
método:Como
con salida:
Tenga en cuenta que para garantizar la coherencia en caso de múltiples subprocesos tienen acceso a esta estructura de datos,
ConcurrentHashMap
yCopyOnWriteArrayList
, por ejemplo, necesidad de ser utilizado.fuente
computeIfAbsent
.map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
Si usa Spring Framework . No es:
org.springframework.util.MultiValueMap
.Para crear un mapa de valores múltiples no modificable:
O usar
org.springframework.util.LinkedMultiValueMap
fuente
Si y no. La solución es crear un clasificador Wrapper para sus valores que contenga los 2 (3 o más) valores que corresponden a su clave.
fuente
Sí, esto se llama frecuentemente a
multimap
.Ver: http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html
fuente
La forma más fácil sería usar una biblioteca de colección de Google:
Enlace Maven: https://mvnrepository.com/artifact/com.google.collections/google-collections/1.0-rc2
más sobre esto: http://tomjefferys.blogspot.be/2011/09/multimaps-google-guava.html
fuente
Tengo los mejores resultados.
Solo tienes que crear nuevos me
HashMap
gustaen tu
for
bucle Tendrá el mismo efecto que la misma clave y múltiples valores.fuente
Salida:
Esta es la biblioteca Google-Guava para funcionalidades de utilidad. Esta es la solución requerida.
fuente
No pude publicar una respuesta al comentario de Paul, así que estoy creando un nuevo comentario para Vidhya aquí:
Wrapper será un
SuperClass
para las dos clases que queremos almacenar como valor.y dentro de la clase wrapper, podemos poner las asociaciones como objetos de variable de instancia para los dos objetos de clase.
p.ej
y en HashMap podemos poner de esta manera,
WrapperObj tendrá variables de clase:
class1Obj, class2Obj
fuente
Puedes hacerlo implícitamente.
Esto es muy simple y efectivo. Si desea valores de diferentes clases, puede hacer lo siguiente:
fuente
Se puede hacer usando un identityHashMap, sujeto a la condición de que la comparación de claves será realizada por == operador y no es igual a ().
fuente
Prefiero lo siguiente para almacenar cualquier número de variables sin tener que crear una clase separada.
fuente
Estoy tan acostumbrado a hacer esto con un Diccionario de datos en el Objetivo C. Fue más difícil obtener un resultado similar en Java para Android. Terminé creando una clase personalizada y luego haciendo un hashmap de mi clase personalizada.
fuente
Podemos crear una clase para tener múltiples claves o valores y el objeto de esta clase se puede usar como parámetro en el mapa. Puede consultar https://stackoverflow.com/a/44181931/8065321
fuente
Uso de recopiladores de Java
donde departamento es tu llave
fuente
Pruebe LinkedHashMap , muestra:
salida:
fuente
linked
ya no existirá en el mapa porque lo reemplazaste porhash
.