打印球拍中的对列表

Print list of pairs in Racket

编程 Racket/base,

我正在努力完成两件事...

首先: 我正在尝试从已创建的散列映射中创建一个已排序的 对列表。我相当确定这部分有效但是...

为了检查我想打印对列表。

其次:我在引用每个列表条目的正确方法上遇到问题,我尝试使用 lambda 函数迭代列表,但我不知道我是否需要使用 car 和 cdr 来获取对参数,或者我用 ~a 为每个条目编码的方式是否可行。

'''

      (define sorted-keys (sort(hash->list countMap) #:key car string<?))
      
      (printf "The entries are: ")
        (for-each
         (lambda (entry) (entry (in-list sorted-keys))
           (printf "~a = ~a~n (car entry) (cdr entry)))

'''

我是 Racket 的新手,我正在努力阅读有关 for/list 的文档以及如何遍历对列表。在使用 lambda 时,我应该在成对列表上使用“for-each”吗?

任何指导将不胜感激。

For-each 有这些参数:过程和迭代集合。所以,这会起作用:

(define my-hash (hash "Amy" 20 "John" 10 "Adam" 5 "Alice" 12))

(define sorted-list (sort (hash->list my-hash) string<? #:key car))

(printf "The entries are:~n")

(for-each (lambda (entry)
            (printf "~a = ~a~n" (car entry) (cdr entry)))
          sorted-list)

请注意 for-each 仅用于 side-effects(例如,打印),它不会 return 任何东西。您可以使用 map 迭代哪个 returns 列表:

(map (lambda (entry) (list (car entry) (+ 1 (cdr entry))))
     sorted-list)

=> (("Adam" 6) ("Alice" 13) ("Amy" 21) ("John" 11))

For/list has more options (see Racket docs for for), 但有时你使用哪个并不重要:

> (for/list ([entry sorted-list])
    (list (car entry) (+ 1 (cdr entry))))

(("Adam" 6) ("Alice" 13) ("Amy" 21) ("John" 11))

对了,还有hash-for-each,不用转换了:

(printf "~nThe entries are:~n")

(hash-for-each my-hash
               (lambda (key val)
                 (printf "~a = ~a~n" key val)))

哈希有自己的映射版本 hash-map(returns 列表):

> (hash-map my-hash
          (lambda (key val)
            (list (string-upcase key) val)))

(("ALICE" 12) ("JOHN" 10) ("AMY" 20) ("ADAM" 5))

另请参阅 Racket docs 了解其他对哈希表有用的函数。