L oop и получим последнее итоговое значение - PullRequest
1 голос
/ 29 марта 2020

Предположим, у меня есть список и результат

[
  {
      "userTaskId": 10,
      "counter": 1,
      "userName" : "test name one"
  },
  {
      "userTaskId": 10,
      "counter": 2,
      "userName" : "test name two"
  },
  {
      "userTaskId": 10,
      "counter": 3,
      "userName" : "test name three"
  },
  {
      "userTaskId": 20,
      "counter": 1,
      "userName" : "test name"
  },
  {
      "userTaskId": 20,
      "counter": 1,
      "userName" : "test name four"
  },
  {
      "userTaskId": 20,
      "counter": 3,
      "userName" : "test name five"
  },
]

, и я пройду через него oop

List<UserModel> savedUser = userRepository.findAll();

for (UserModel user: savedUser) {
    Double number = user.getCounter() * 1000;

    /* 
     * number result will be
     * 1000 -> userTaskId: 10
     * 2000 -> userTaskId: 10
     * 3000 -> userTaskId: 10
     * 1000 -> userTaskId: 20
     * 1000 -> userTaskId: 20
     * 3000 -> userTaskId: 20
     */
}

Теперь мой вопрос: как мне получить * 1007? * число всего , прежде чем оно изменится на userTaskId . Теперь я реализовал:

Double holder = 0D;
Set<Long> test = new HashSet<>();
Double total = 0D;
List<UserModel> savedUser = userRepository.findAll();
for (UserModel user: savedUser) {
    Double number = user.getCounter() * 1000;
    Long userTaskId = user.getTaskId();


    if (test.contains(limitNo)){
         total += number;
    } else {
         // Save the total value to temporary variable before resetting the total
         holder = total;
         System.out.println(holder);
         total = number;

         test.add(userTaskId);
    }

    /* 
     * total result will be
     * 1000 -> userTaskId: 10
     * 3000 -> userTaskId: 10
     * 6000 -> userTaskId: 10 (I want to get this value)
     * 1000 -> userTaskId: 20
     * 2000 -> userTaskId: 20
     * 5000 -> userTaskId: 20 (I want to get this value)
     */
}

Я хотел получить значения 6000 и 5000 , но я получаю только значение:

0.0 and 6000

Любая идея о том, как я могу получить только эти значения?

1 Ответ

0 голосов
/ 29 марта 2020

попробуйте с этим:

import :
import java.util.List;
import java.util.Map;

import static java.util.stream.Collectors.*;

///////////

Map<Long, Double> getResponse(List<UserModel> savedUser) throws Exception{
        Map<Long, Double> ans = savedUser.stream()
                .collect(groupingBy(UserModel::getUserTaskId, summingDouble(this::getValue)));
        return ans;
    }

private Double getValue(UserModel  userModel) {
    return userModel.getCounter() * 1000;
}

Вот для l oop код:

savedUser.sort((a,b)-> a.getUserTaskId() <= b.getUserTaskId() ? -1 : 1);
        int len = savedUser.size();
        int prev = 0;
        double total = savedUser.get(0).getCounter() * 1000;
        for (int i = 1; i < len; i++) {
            if (savedUser.get(i).getUserTaskId() != savedUser.get(prev).getUserTaskId()) {
                // here from prev to i-1 one group
                // total contains summation of this group
                // do your task
                prev = i;
                total = savedUser.get(i).getCounter() * 1000;
            } else {
                total += (savedUser.get(i).getCounter() * 1000);
            }
        }
        //here is another group from prev to len-1
        //total contains summation of this group
        //do your task
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...