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

Мне нужна помощь, чтобы узнать, как найти что-то в Java, что в настоящее время делается в SQL.Мне нужно найти конкретные данные в списке в течение определенного промежутка времени с использованием сценария потоков

: у меня есть объект ставки с String CustId, мгновенная метка времени, двойная ставка BetmAmount

Мне нужно найти всех клиентовкоторый прошел ограничение 100,00 за 24-часовой период, как бы я сделал это в Java 8?

Метод будет

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

пример данных:

note: to be parsed in List<Bet>

A00001    2019-01-15T02:01:10   43.00
A00001    2019-01-15T04:00:00   13.00
A00001    2019-01-15T04:01:15   50.00
B00034    2019-01-15T05:00:00   15.00
A00001    2019-01-15T06:56:20   5.00
B00034    2019-01-15T06:57:00   20.00
C00004    2019-01-15T07:01:00   90.00
C00004    2019-01-15T07:11:00   30.00
B00034    2019-01-17T01:00:00   90.00

ожидаемый результат:

["A00001","C00004"] (List<String>)

примечание: список будет содержать все ставки с идентификатором diff cust и хронологическими временными метками

Скользящий 24-часовой период и группировка клиентов объединены, что сложно.Я пытаюсь решить.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

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

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());
}
1 голос
/ 18 марта 2019

Сначала вы можете сгруппировать данные по идентификатору клиента, а затем проанализировать суммы за 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...