java - simplificar - ¿Cómo crear un Multimap<K, V> desde un Mapa<K, Colección<V>>?
simplificacion de mapas de carnot (6)
No encontré una construcción multimap ... Cuando quiero hacer esto, itero sobre el mapa y llene el multimapa. ¿Hay otra manera?
final Map<String, Collection<String>> map = ImmutableMap.<String, Collection<String>>of(
"1", Arrays.asList("a", "b", "c", "c"));
System.out.println(Multimaps.forMap(map));
final Multimap<String, String> expected = ArrayListMultimap.create();
for (Map.Entry<String, Collection<String>> entry : map.entrySet()) {
expected.putAll(entry.getKey(), entry.getValue());
}
System.out.println(expected);
El primer resultado es {1=[[a, b, c, c]]}
pero espero {1=[a, b, c, c]}
ACTUALIZACIÓN: por lo que estás preguntando, creo que vas a necesitar recurrir a Multimap.putAll
.
Aquí hay una versión genérica útil que escribí para mi clase StuffGuavaIsMissing .
/**
* Creates a Guava multimap using the input map.
*/
public static <K, V> Multimap<K, V> createMultiMap(Map<K, ? extends Iterable<V>> input) {
Multimap<K, V> multimap = ArrayListMultimap.create();
for (Map.Entry<K, ? extends Iterable<V>> entry : input.entrySet()) {
multimap.putAll(entry.getKey(), entry.getValue());
}
return multimap;
}
Y una versión inmutable:
/**
* Creates an Immutable Guava multimap using the input map.
*/
public static <K, V> ImmutableMultimap<K, V> createImmutableMultiMap(Map<K, ? extends Iterable<V>> input) {
ImmutableMultimap.Builder<K, V> builder = ImmutableMultimap.builder();
for (Map.Entry<K, ? extends Iterable<V>> entry : input.entrySet()) {
builder.putAll(entry.getKey(), entry.getValue());
}
return builder.build();
}
Asumiendo que tienes
Map<String, Collection<String>> map = ...;
Multimap<String, String> multimap = ArrayListMultimap.create();
Entonces creo que esto es lo mejor que puedes hacer
for (String key : map.keySet()) {
multimap.putAll(key, map.get(key));
}
o el más óptimo, pero más difícil de leer
for (Entry<String, Collection<String>> entry : map.entrySet()) {
multimap.putAll(entry.getKey(), entry.getValue());
}
Código siguiente sin la biblioteca de Guava de Google. Se usa para doble valor como clave y orden ordenado
Map<Double,List<Object>> multiMap = new TreeMap<Double,List<Object>>();
for( int i= 0;i<15;i++)
{
List<Object> myClassList = multiMap.get((double)i);
if(myClassList == null)
{
myClassList = new ArrayList<Object>();
multiMap.put((double) i,myClassList);
}
myClassList.add("Value "+ i);
}
List<Object> myClassList = multiMap.get((double)0);
if(myClassList == null)
{
myClassList = new ArrayList<Object>();
multiMap.put( (double) 0,myClassList);
}
myClassList.add("Value Duplicate");
for (Map.Entry entry : multiMap.entrySet())
{
System.out.println("Key = " + entry.getKey() + ", Value = " +entry.getValue());
}
Esta pregunta es un poco vieja, pero pensé que daría una respuesta actualizada. Con Java 8 puedes hacer algo a lo largo de las líneas de
ListMultimap<String, String> multimap = ArrayListMultimap.create();
Map<String, Collection<String>> map = ImmutableMap.of(
"1", Arrays.asList("a", "b", "c", "c"));
map.forEach(multimap::putAll);
System.out.println(multimap);
Esto debería darte {1=[a, b, c, c]}
, como desees.
LinkedListMultimap<String, String> mm = map.entrySet()
.stream()
.collect(
() -> LinkedListMultimap.create(map.size()),
(m, e) -> m.putAll(e.getKey(), e.getValue()),
(m1, m2) -> m1.putAll(m2));