Ракетка BSL: Как я могу объединить два экземпляра структуры в списке, которые имеют один общий атрибут? - PullRequest
0 голосов
/ 20 января 2020

У меня есть список экземпляров структуры, называемой «контакт», которая в основном является номером телефона и продолжительностью разговора с ними.

Теперь я хочу сложить все записи одного и того же телефона. номер с общей продолжительностью всех вызовов с ними.

Например: я хочу превратить:

(list
   (make-contact "0111222222" 2)
   (make-contact "0111222222" 6)
   (make-contact "0111333333" 5)
   (make-contact "0111444444" 3)
   (make-contact "0111555555" 8)
   (make-contact "0111555555" 2))

в:

(list
   (make-contact "0111222222" 8)
   (make-contact "0111333333" 5)
   (make-contact "0111444444" 3)
   (make-contact "0111555555" 10))

Я использую Racket BSL со списком аббревиатуры

1 Ответ

0 голосов
/ 20 января 2020

Это работает с htdp / bsl (мне интересно, если есть более чистое решение):

#lang htdp/bsl

(define-struct contact (number time))

(define contacts (list
   (make-contact "0111222222" 2)
   (make-contact "0111222222" 6)
   (make-contact "0111333333" 5)
   (make-contact "0111444444" 3)
   (make-contact "0111555555" 8)
   (make-contact "0111555555" 2)))

(define (sum-contacts acc s)
    (cond [(empty? s) acc]
          [(and (not (empty? acc))
                (equal? (contact-number (first s))
                        (contact-number (first acc))))
            (sum-contacts (cons
                            (make-contact
                               (contact-number (first s))
                               (+ (contact-time (first s))
                                  (contact-time (first acc)))) (rest acc))
                (rest s))]
          [else (sum-contacts (cons (first s) acc) (rest s))]))

(reverse (sum-contacts '() contacts))
...