Войти Регистрация
Конкурентность

20. Тарификация звонков в parallelStream

Средняя

Java · 35 строк

За сутки коммутаторы региона отдают около 10 млн записей CDR: номер, начало звонка, длительность в секундах. process суммирует секунды по дням, битые записи складывает в rejected для разбора.

Отметьте строки с ошибками.

В работе: Суточная сверка минут для биллинга.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
parallelStreamSimpleDateFormatHashMapArrayListпотокобезопасность

Источник: на задачах МТС: биллинг звонков. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import java.text.SimpleDateFormat;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. public class CallBilling {
  8. private static final SimpleDateFormat FMT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  9. private final Map<String, Long> secondsByDay = new HashMap<>();
  10. private final List<String> rejected = new ArrayList<>();
  11. // Строка CDR: "79161234567;2026-10-19 23:58:41;185"
  12. public void process(List<String> cdrs) {
  13. cdrs.parallelStream().forEach(line -> {
  14. String[] p = line.split(";");
  15. try {
  16. Date start = FMT.parse(p[1]);
  17. String day = new SimpleDateFormat("yyyy-MM-dd").format(start);
  18. secondsByDay.merge(day, Long.parseLong(p[2]), Long::sum);
  19. } catch (Exception e) {
  20. rejected.add(line);
  21. }
  22. });
  23. }
  24. public Map<String, Long> report() {
  25. return secondsByDay;
  26. }
  27. public List<String> rejected() {
  28. return rejected;
  29. }
  30. }