Создание списка структур из другого списка структур в Racket - PullRequest
0 голосов
/ 19 января 2020

У меня есть задача, которую нужно решить, и, к сожалению, я дошел до того, что не уверен, нахожусь ли я на правильном пути. Параметр - это телефон, в котором у вас есть список вызовов, каждый из которых имеет структуру (время вызова Дата телефона Продолжительность), и я должен суммировать все вызовы с определенного номера (Телефон) и создать список контактов с каждым номером, который суммирует продолжительность (длительность телефонного контакта).

Итак, вопрос в том, как мне, например, получить от

(list (make-call Date1 "123" 1.5) (make-call Date2 "123" 4) (make-call Date3 "456" 2))

до

(list (make-contact "123" 5.5) (make-contact "456" 2))

Мой план состоит в том, чтобы сначала отфильтруйте список вызовов для определенного имени:

;(define CALL1 (make-call "18.01." "101010" 4.5))
;(define CALL2 (make-call "01.01." "222222" 1.0))
;(define CALL3 (make-call "13.01." "123456" 20.2))
;(define CALL4 (make-call "05.01." "999999" 10))

; (list-of-Call) Name  -> (List-of-Call)
; filters all calls with a certain name from a list of calls
(check-expect (filter-by-number empty "101010") empty)
(check-expect (filter-by-number (list CALL1 CALL1) "101010") (list CALL1 CALL1))
(check-expect (filter-by-number (list CALL1 CALL2) "Jonas") empty)

(define (filter-by-number lst nam)
  (if (empty? lst)
      empty
      (if (string=? (call-callee (first lst)) nam)
          (append (filter-by-number (first lst) nam) (filter-by-number (rest lst) nam))
          empty)))

К сожалению, эта функция еще не работает должным образом.

На втором шаге я планирую как-то перевести этот тогехтер в создайте необходимый список контактов, и вот где я застрял:

;(List-of-Call) -> (List-of-Contact)
;computes the total duration of all calls of a certain number
(check-expect (compute-contacts empty) empty)
(check-expect (compute-contacts (list CALL1)) (list (make-contact "101010" 4.5)))
(check-expect (compute-contacts (list CALL1 CALL2 CALL3)) (list (make-contact "101010" 4.5) (make-contact "222222" 1.0) (make-contact "123456" 20.2)))
(check-expect (compute-contacts (list CALL4 CALL4)) (list (make-contact "999999" 20)))
(check-expect (compute-contacts (list CALL4 CALL4 CALL1) (list (make-contact "999999" 20))) (make-contact "101010" 4.5))

(define (summarize-contacts lst)
  (if (empty? lst)
      empty
      (append (make-contact ...) (make-contact ...))))

Как бы вы поступили отсюда? Или вы бы сделали это совсем по-другому? Любые советы приветствуются:)

Ура!

...