Tæller elementer fra kortet med Sæt som værdi
Jeg har en liste over elementer som nedenfor
List<SomeModel> smList = new ArrayList<>(); smList.add(new SomeModel(1L,6.0f));//id = 1L and capacity = 6.0f smList.add(new SomeModel(2L,7.0f)); smList.add(new SomeModel(3L,7.0f)); smList.add(new SomeModel(4L,7.0f));
Nu konverterer jeg denne liste til
Map<Float, Set<Long>> complexList = new HashMap<>(); complexList = smList.stream().collect(Collectors.groupingBy(SomeModel::getCapacity, Collectors.mapping(SomeModel::getId, Collectors.toSet())));
her giver kompleksList output som
7.0=[2, 3, 4] 6.0=[1]
Nu skal jeg tælle antallet af værdier for hver "kapacitet", der giver output som
7.0=3 6.0=1
Jeg prøvede
Map<Float, Long> complexCount = complexList.entrySet().stream(). collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.counting()))); complexCount.forEach((k,v)->System.out.println(k+"="+v));
og den udsender
6.0=1 7.0=1
Jeg må tage fejl i at forstå strømme eller ikke bruge de rigtige metoder. Kan nogen foreslå en fremgangsmåde eller en løsning? Referencelink til streams vil også være nyttigt.
Svar
hvis alt du ønsker at gøre er at udskrive hver nøgle på kortet sammen med størrelsen af den tilsvarende værdi, så er der ingen grund til at streame igen, da det forårsager unødvendig overhead. gentag blot complexList
for meget og udskriv det sådan:
complexList.forEach((k,v)->System.out.println(k+"="+v.size()));
eller hvis du virkelig vil have et kort så kunne man også gøre:
Map<Float, Integer> accumulator = new HashMap<>(); complexList.forEach((k,v)->accumulator.put(k, v.size()));