Как добавить значения приращения, используя хэш-карту - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть таблица, известная как клиент, в которой есть столбец с именем create_time, так что на самом деле я хочу построить карту таким образом, чтобы я мог сказать, в каком году и в каком месяце сколько клиентов добавлено? и теперь спросим, ​​предположим, в ноябре 2018 года было добавлено 2 клиента, а в декабре 2018 года добавлено 0 клиентов, поэтому в декабре я также покажу 2 (как в предыдущих месяцах + текущий месяц), и если в январе 2019 года добавится 1 клиент,я покажу 3 и так далее

ТАК, чтобы решить эту проблему, я создал hashMap, в котором первый ключ - год, и я сделал еще одну hashMap, в которой ключ - месяц, а затем номер клиента, который являетсядобавлен, например, HashMap>

Ожидаемый вывод ::

clientsByMonth": {
                    "2018": {
                        "10": 1,(1 client added in oct)
11,1( as 0 client added in nov)
12,2( as 1 client added in december)
                    },
                    "2019": {
                        "1": 2,   ( as no client added )
                        "2": 4,   (as 2 client added)
                        "3": 5,
                        "4": 5
                    }
    HashMap<Integer, HashMap<Integer, Integer>> clientsByYear = new HashMap<>();
    List<Client> clientList = clientRepository.findAll();

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

        Instant instant = Instant.ofEpochMilli(clientList.get(i).getCreatedTime().getTime());
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        Integer month = localDateTime.toLocalDate().getMonth().getValue();
        Integer year = localDateTime.toLocalDate().getYear();

        if (!clientsByYear.containsKey(year)) {
            HashMap<Integer, Integer> clientByMonth = new HashMap<>();
            clientByMonth.put(month, 1);
            clientsByYear.put(year, clientByMonth);
        } else {
            HashMap<Integer, Integer> clientByMonth = clientsByYear.get(year);
            if (!clientByMonth.containsKey(month)) {
                int clients = 0;
                for (int j = month - 1; j >= 0; j--) {
                    if (clientByMonth.containsKey(j)) {
                        clients = clients + clientByMonth.get(j);
                        break;
                    }
                }
                clientByMonth.put(month, (clients + 1));
            } else if (clientByMonth.containsKey(month)) {
                int clients = clientByMonth.get(month);
                clientByMonth.put(month, (clients + 1));
            }
        }
    }

1 Ответ

1 голос
/ 01 ноября 2019

См. Ниже, это должно решить вашу проблему, если я правильно понял вашу проблему

  1. Итерировать всех клиентов
  2. Добавить, если карта года не содержит ее
  3. Иначе получить существующую запись из карты года
  4. Добавить карту месяца с счетчиком итераций в качестве последнего значения
for (int i = 1; i <=clientList.size() ; i++) {
        ...

     if (!clientsByYear.containsKey(year)) {
            HashMap<Integer, Integer> clientByMonth = new HashMap<>();
            clientByMonth.put(month, i);
            clientsByYear.put(year, clientByMonth);
        } else {
            HashMap<Integer, Integer> clientByMonth = clientsByYear.get(year);
            clientByMonth.put(month, i);
        }
      }
    System.out.println(clientsByYear);
  }

Ожидается: входные данные отсортированы по времени asc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...