Java >> Java tutorial >  >> Java

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

Java tag