为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Java 8 流,如何查找特定时间段内具有特定条件的项目

使用 Java 8 流,如何查找特定时间段内具有特定条件的项目

郎朗坤 2022-08-17 10:49:00
我需要帮助来了解如何在java中找到一些目前正在sql中完成的东西。我需要使用流在特定持续时间内的列表中查找特定数据场景:我有一个带有字符串 CustId、即时时间戳、双倍 betAmount 的 Bet 对象我需要找到所有超过每24小时100.00限制的客户,在Java 8中该怎么做?该方法是public List<String> findLimits(List<Bet> bets){...}示例数据 :note: to be parsed in List<Bet>A00001    2019-01-15T02:01:10   43.00A00001    2019-01-15T04:00:00   13.00A00001    2019-01-15T04:01:15   50.00B00034    2019-01-15T05:00:00   15.00A00001    2019-01-15T06:56:20   5.00B00034    2019-01-15T06:57:00   20.00C00004    2019-01-15T07:01:00   90.00C00004    2019-01-15T07:11:00   30.00B00034    2019-01-17T01:00:00   90.00预期结果:["A00001","C00004"] (List<String>)注意:该列表将包含所有带有差异 cust id 和时间顺序时间戳的投注滑动的24小时周期和组合客户组合是我试图解决的棘手问题。
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您可以使用投注金额的总和来映射日期。然后过滤它们。

public List<String> findLimits(List<Bet> bets) {    return bets.stream()
            .collect(Collectors.toMap(
                    b -> b.getCustId() + LocalDate.ofInstant(b.getTimestamp(), ZoneOffset.UTC).toString(),
                    Bet::getAmount,
                    (o1, o2) -> o1 + o2))
            .entrySet().stream()
            .filter(e -> e.getValue() > 100.0)
            .map(e -> e.getKey().substring(0, e.getKey().length() - LocalDate.EPOCH.toString().length()))
            .collect(Collectors.toList());
}


查看完整回答
反对 回复 2022-08-17
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

首先,您可以按客户ID对数据进行分组,然后在24小时内分析总和。正如你所提到的,记录是按日期升序排序的,所以方法可以如下所示:findLimits


class Bet {

    String ID;

    LocalDateTime dateTime;

    BigDecimal value;

}


public List<String> findLimits(List<Bet> bets) {

    BigDecimal sumLimit = new BigDecimal(100);

    Map<String, List<Bet>> map = new HashMap<String, List<Bet>>();

    List<String> result = new ArrayList<String>();

    for (Bet bet : bets) {

        if (map.get(bet.ID) == null)

            map.put(bet.ID, new ArrayList<Bet>());

        map.get(bet.ID).add(bet);

    }


    for (String ID : map.keySet()) {

        List<Bet> betListForCustomer = map.get(ID);

        boolean customerExceededLimit = false;

        for (int i = 0; i < betListForCustomer.size(); i++) {

            LocalDateTime endOfPeriod = betListForCustomer.get(i).dateTime.plusDays(1); //calculating end of 24h period current data

            BigDecimal sum = new BigDecimal(0);

            for (int j = i; j < betListForCustomer.size() //move start period to next dateTime

                    && endOfPeriod.isAfter(betListForCustomer.get(j).dateTime); j++) { //analyzing to the last date in 24h period or end data set

                sum = sum.add(betListForCustomer.get(j).value);

            }

            if (sum.compareTo(sumLimit) >= 0) { //sum >= 100

                customerExceededLimit = true;

                break; //there is no need to analyze this customer, limit exceeded

            }

        }

        if (customerExceededLimit) {

            result.add(ID);

        }

    }

    return result;

}


查看完整回答
反对 回复 2022-08-17
  • 2 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信