2017-12-09 4 views
0

Java-8-Streams verwenden, wie flach ich ein Map<Integer, Map<String, Boolean>> nur ein List<Boolean> so dass die endgültige Liste, die alle booleans über alle Werte enthalten? HierAbflachen eine Karte <Integer, Map <String, Boolean >> auf eine Liste <Boolean>

ist ein Beispiel für die Daten:

1 -> [{"ABC" -> true}, {"DEF" -> true}] 
2 -> [{"DEF" -> false}, {"EFG" -> true}] 
3 -> [{"ABC" -> true}, {"DEF" -> false}] 

Ich möchte dies zu einer List<Boolean> abzuflachen, so dass meine Liste enthalten:

{true, true, false, true, true, false} 

Bestellung nicht wichtig ist. Inhalt ist wichtig.

+0

Können Sie ein Beispiel dafür geben, was Sie versucht haben? also können wir sehen, ob wir helfen können? – Ivonet

+1

Probieren Sie Flatmap aus ... und vielleicht möchten Sie das Problem darstellen, das Sie damit lösen wollen. Ich vermute, dass Sie keine Karte abflachen, sondern gruppieren oder reduzieren müssen. – CoronA

+2

Das ist eine seltsame Anforderung, was können Sie mit einer solchen Liste machen? Die einzige nützliche Information ist die Anzahl von Wahr/Falsch. Oder lesen Sie [this] (https://softwareengineering.meta.stackexchange.com/questions/6166/open-letter-to-students-with-homework-problems). –

Antwort

0

Basierend auf

möchte ich dies auf eine Liste glätten, so dass meine Liste enthalten: {true, true, false, true, true, false}

die Lösung könnte sein, wie diese

Map<Integer, Map<String, Boolean>> map = new HashMap<>(); 
    map.put(1, new HashMap<String, Boolean>(){{put("ABC", true);put("DEF", true);}}); 
    map.put(2, new HashMap<String, Boolean>(){{put("DEF", false);put("EFG", true);}}); 
    map.put(3, new HashMap<String, Boolean>(){{put("ABC", true);put("DEF", false);}}); 

    System.out.println(map.entrySet().stream().flatMap(t -> t.getValue().values().stream()).collect(Collectors.toList())); 
+0

scheint genau die gleiche Antwort wie hier: https://Stackoverflow.com/a/47733489/1059372 – Eugene

1

Sie können so etwas wie tun:

final Map<Integer, List<Entry>> map = new HashMap<>(); 
    map.put(1, Arrays.asList(new Entry("ABC", true), new Entry("DEF", true))); 
    map.put(2, Arrays.asList(new Entry("DEF", false), new Entry("EFG", true))); 
    map.put(3, Arrays.asList(new Entry("ABC", true), new Entry("DEF", false))); 

    final List<Boolean> booleans = map.entrySet() 
     .stream() 
     .flatMap(entry -> entry.getValue().stream()) 
     .map(entry -> entry.value) 
     .collect(Collectors.toList()); 

    System.out.println(booleans); 

Beachten Sie jedoch, dass die Bestellung hier nicht gespeichert wird, da es sich um eine HashMap handelt.

+0

Warum beginnend mit einem '.entrySet()' nur um 'entry.getValue()' auf jedem zu nennen? Sie können mit 'map.values ​​()' an erster Stelle beginnen, 'map.values ​​() .stream() .flatMap (liste -> list.stream())' ... – Holger

+0

@Holger Kann durch 'values ​​() 'es ändert jedoch nicht die Komplexität, da Sie sowieso' flatMap' + 'map' benötigen würden. –

+0

Tatsächlich ändert es die Komplexität nicht. Es wird auch nicht +0 an jeden numerischen Ausdruck angehängt ... – Holger

2

Try this:

 Map<Integer, Map<String, Boolean>> map = new HashMap<Integer, Map<String, Boolean>>(); 
     final List<Boolean> collect = map 
      .values() 
      .stream() 
      .flatMap(it -> it.values().stream()) 
      .collect(Collectors.toList()); 
1

haben einen Blick auf die folgenden:

final List<Boolean> collect = map.values().stream() // Stream<Map<String,Boolean>> 
    .map(Map::values)        // Stream<Collection<Boolean>> 
    .flatMap(Collection::stream)     // Stream<Boolean> 
    .collect(Collectors.toList());  

Der Unterschied zu diesem und den anderen Antworten zur Verfügung gestellt ist, dass jede Zeile enthält nur ein Betrieb (die I persönlich bevorzugen, ist es besser lesbar).

+0

Der Unterschied besteht darin, dass Sie Kommentare hinzugefügt haben, die helfen zu verstehen, was passiert. Besonders hilfreich für Anfänger, nett! – Zabuza

Verwandte Themen