utilizando simplificar simplificacion profe por metodo mapas mapa logicos karnaugh garcia expresiones ejercicios como circuitos carnot booleanas java guava multimap

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));