Quiero poner el mapa en el campo de valor del mapa:

Map<String,String> innermap = new HashMap<String, String>();
Map<String ,Map<String,String>> map = new HashMap<String ,Map<String,String>>();

map.put("AAA", innermap.put("ab", "a , b") );

Esto me da el siguiente error:

The method put(String, Map<String,String>) in the type Map<String,Map<String,String>> is not applicable for the arguments (String, String)

¿Es eso siquiera posible? En caso afirmativo, ¿cómo utilizar el mapa dentro de un mapa o cualquier otra tecnología que sustituya a esta estructura?

-1
The Curious Guy 9 jul. 2021 a las 16:29

3 respuestas

La mejor respuesta

Si, puedes hacerlo. Como ya se explicó, uno podría hacerlo así.

Map<String,String> innerMap = new HashMap<>();
Map<String ,Map<String,String>> map = new HashMap<>();
innerMap.put("ab", "a, b");
map.put("AAA", innerMap);

Pero a partir de Java 8, puede crear el mapa como un valor si no existe, que luego se devuelve usando computeIfAbsent Si el valor (es decir, el mapa) no existe para la clave, se agrega y luego se devuelve . De lo contrario, el valor (es decir, el mapa) simplemente se devuelve para la clave dada.

Map<String,Map<String,String> map = new HashMap<>();
map.computeIfAbsent("BBB", v->new HashMap<>()).put("r","s");
map.entrySet().forEach(System.out::println);
map.computeIfAbsent("BBB", v->new HashMap<>()).put("t","v");
map.entrySet().forEach(System.out::println);

Huellas dactilares

BBB={r=s}
BBB={r=s, t=v}
0
WJS 9 jul. 2021 a las 17:48

El método de colocación en un mapa no devuelve el mapa al que está colocando ... debe cambiar su código ligeramente:

Map<String,String> innermap = new HashMap<String, String>();
Map<String ,Map<String,String>> map = new HashMap<String ,Map<String,String>>();
innermap.put("ab", "a , b")
map.put("AAA", innermap);
0
David Wright 9 jul. 2021 a las 13:36

innermap.put("ab", "a , b") devolverá el tipo de su valor -> en su caso es String.

En código fuente java: public interface Map<K,V> función V put(K key, V value);

 * @return the previous value associated with <tt>key</tt>, or
 *         <tt>null</tt> if there was no mapping for <tt>key</tt>.
 *         (A <tt>null</tt> return can also indicate that the map
 *         previously associated <tt>null</tt> with <tt>key</tt>,
 *         if the implementation supports <tt>null</tt> values.)

Cuando pones todo en línea, java intentará evaluar innermap.put("ab", "a , b") en tu parámetro primero, luego obtendrás el resultado nulo con el tipo String, luego java evaluará map.put("AAA", yourStringResult); Es por eso que muestra un error en el registro :

No puedes poner (String,String) en un mapa de Map<String,Map<String,String>>

Usted debe hacer esto :

Map<String,String> innermap = new HashMap<String, String>();
Map<String ,Map<String,String>> map = new HashMap<String ,Map<String,String>>();
innermap.put("ab", "a , b")

map.put("AAA", innermap );
0
Yiao SUN 9 jul. 2021 a las 20:08