第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 8 中超過 2 個 groupingBy 操作

Java 8 中超過 2 個 groupingBy 操作

慕田峪7331174 2023-06-21 13:55:36
這是我的“revenue_data.csv”文件:Client  ReportDate  RevenueC1      2019-1-7    12C2      2019-1-7    34C1      2019-1-16   56C2      2019-1-16   78C3      2019-1-16   90我讀取文件的案例類是:package com.source.code;import java.time.LocalDate;public class RevenueRecorder {    private String clientCode;    private LocalDate reportDate;    private int revenue;    public RevenueRecorder(String clientCode, LocalDate reportDate, int revenue) {        this.clientCode = clientCode;        this.reportDate = reportDate;        this.revenue = revenue;    }    public String getClientCode() {        return clientCode;    }    public LocalDate getReportDate() {        return reportDate;    }    public int getRevenue() {        return revenue;    }}我可以按以下方式讀取文件并按 ReportDate、sum(revenue) 進(jìn)行分組:import com.source.code.RevenueRecorder;import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Files;import java.nio.file.Path;import java.time.LocalDate;import java.time.format.DateTimeFormatter;import java.util.ArrayList;import java.util.List;import java.util.Map;import static java.util.stream.Collectors.groupingBy;import static java.util.stream.Collectors.summingInt;public class RevenueRecorderMain {    public static void main(String[] args) throws IOException {        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");        List<RevenueRecorder> revenueRecords = new ArrayList<>();        Path path = FileSystems.getDefault().getPath("src", "main", "resources",                "data", "revenue_data.csv");        Files.lines(path)                .skip(1)                .map(s -> s.split(","))                .forEach(s ->我的問題是如何在 Java 8 中按 ReportDate、count(clientCode) 和 sum(revenue) 進(jìn)行分組,具體來說:使用什么集合來代替 Map在這種情況下如何進(jìn)行分組和收集(通常對于超過 2 個分組)
查看完整描述

3 回答

?
子衿沉夜

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個贊

雖然你的嘗試沒有成功,但我覺得是你最想表達(dá)的。所以我只是按照你的代碼并修復(fù)它。試試這個!

Map<LocalDate,?ImmutablePair<Integer,?Map<String,?Long>>>?map?=?revenueRecords.stream()
????????????.collect(groupingBy(RevenueRecorder::getReportDate,
????????????????????collectingAndThen(toList(),?list?->?new?ImmutablePair(list.stream().collect(summingInt(RevenueRecorder::getRevenue)),
??????????????????????????????????????????????????????????????????????????list.stream().collect(groupingBy(RevenueRecorder::getClientCode,?Collectors.counting()))))));

結(jié)果如下

http://img1.sycdn.imooc.com/649290fe0001379504480025.jpg

這是我自己的想法,希望能幫到你。╰( ̄▽ ̄)╭



查看完整回答
反對 回復(fù) 2023-06-21
?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個贊

如果您已經(jīng)使用 Java 12,則有一個新的收集器Collectors.teeing(),它允許使用兩個獨(dú)立的收集器進(jìn)行收集,然后使用提供的 BiFunction 合并它們的結(jié)果。傳遞到結(jié)果收集器的每個元素都由兩個下游收集器處理,然后使用指定的合并函數(shù)將它們的結(jié)果合并到最終結(jié)果中。因此Collectors.teeing()可能很適合,因?yàn)槟胍嫈?shù)和求和。


Map<LocalDate, Result> pairedReportDateMRR = 

    revenueRecords.stream().collect(Collectors.groupingBy(RevenueRecorder::getReportDate,

                    Collectors.teeing(Collectors.counting(),

                            Collectors.summingInt(RevenueRecorder::getRevenue), Result::new)));

    System.out.println(pairedReportDateMRR); 


   //output: {2019-01-07={count=2, sum=46}, 2019-01-16={count=3, sum=224}}

出于測試目的,我使用了以下簡單的靜態(tài)類


static class Result {

    private Long count;

    private Integer sum;

    public Result(Long count, Integer sum) {

        this.count = count;

        this.sum = sum;

    }

    @Override

    public String toString() {

        return "{" + "count=" + count + ", sum=" + sum + '}';

    }

}


查看完整回答
反對 回復(fù) 2023-06-21
?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個贊

首先,Map<LocalDate, Pair<Integer, Integer>>由于您想進(jìn)行第二次分組,您無法制作地圖,這意味著對于同一日期,您可能有多個客戶代碼,每個客戶代碼都有單獨(dú)的計數(shù)器。


所以如果我沒猜錯你就不會得到這樣的東西Map<LocalDate, MutablePair<Integer, Map<String, Integer>>>,如果它是正確的試試這個代碼片段:


public static void main(String[] args) {

    String data = "C1,2019-1-7,12\n" +

            "C2,2019-1-7,34\n" +

            "C1,2019-1-16,56\n" +

            "C2,2019-1-16,78\n" +

            "C3,2019-1-16,90";


    Stream.of(data.split("\n")).forEach(System.out::println);


    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");

    List<RevenueRecorder> revenueRecords = Stream.of(data.split("\n")).map(line -> {

        String[] s = line.split(",");

        String clientCode = s[0];

        LocalDate reportDate = LocalDate.parse(s[1].trim(), formatter);

        int revenue = Integer.parseInt(s[2]);

        return new RevenueRecorder(clientCode, reportDate, revenue);

    }).collect(toList());


    Supplier<MutablePair<Integer, Map<String, Integer>>> supplier = () -> MutablePair.of(0, new HashMap<>());

    BiConsumer<MutablePair<Integer, Map<String, Integer>>, RevenueRecorder> accumulator = (pair, recorder) -> {

        pair.setLeft(pair.getLeft() + recorder.getRevenue());

        pair.getRight().merge(recorder.getClientCode(), 1, Integer::sum);

    };

    BinaryOperator<MutablePair<Integer, Map<String, Integer>>> combiner = (p1, p2) -> {

        p1.setLeft(p1.getLeft() + p2.getLeft());

        p2.getRight().forEach((key, val) -> p1.getRight().merge(key, val, Integer::sum));

        return p1;

    };


    Map<LocalDate, MutablePair<Integer, Map<String, Integer>>> pairedReportDateMRR = revenueRecords.stream()

            .collect(

                    groupingBy(RevenueRecorder::getReportDate,

                            Collector.of(supplier, accumulator, combiner))

            );


    System.out.println(pairedReportDateMRR);

}


查看完整回答
反對 回復(fù) 2023-06-21
  • 3 回答
  • 0 關(guān)注
  • 259 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號