С потоками Java 8, Как найти элементы с определенными условиями в течение определенного периода

Он должен быть static class GenTest, поскольку вы создаете его экземпляр из статического метода.

Также, как правило, внутренние классы должны быть статическими.

-1
задан Andy Turner 17 March 2019 в 22:24
поделиться

2 ответа

Сначала вы можете сгруппировать данные по идентификатору клиента, а затем проанализировать суммы за 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;
}
0
ответ дан glw 17 March 2019 в 22:24
поделиться

Вы можете сопоставить даты с суммой ставок. Затем отфильтруйте их.

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());
}
0
ответ дан Kartik 17 March 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: