【问题标题】:Sorting a list using my own function to sort使用我自己的函数对列表进行排序
【发布时间】:2019-08-05 02:53:30
【问题描述】:

我正在继续学习 Racket,现在我需要使用我自己的函数对列表进行排序。

列表的每个元素,也是列表,需要作为参数传递给我自己的函数,函数会返回一个介于[0, 1]之间的实值。

简而言之:我将有一个需要使用函数排序的列表列表,该函数有一个列表作为参数,它将返回 [0, 1] 之间的实际值。

在 Racket 中,我找到了 sort 函数:

(sort '(1 3 4 2) <)

我需要类似的东西,但我需要使用自己的函数,而不是使用&lt;

#lang racket

(define my-list '(1 2 3 4) '(5 7 3 1) '(9 4 1 8))

(define my-function
  (lambda (lst)
    (let ([result ; Do my own calculations ])
       result))) ; Result is a real number between [0,1].

(define list-sorted (my-sort my-list my-function))

注意:将my-function 想象成一个黑盒,输入为列表,输出为实数。

我该怎么做?

我曾想过创建另一个列表my-list-real-values,其中my-list中每个元素的实数值以相同的顺序,然后使用(sort my-list-real-values &lt;)对其进行排序,但我不知道如何链接这两个列表,my-list-real-valuesmy-list,在我对 my-list-real-values 进行排序时对 my-list 进行排序。

也许我可以使用Hash Tables,但我不知道这是否只是Racket的一个功能,或者它也可以与Scheme一起使用。

【问题讨论】:

  • my-list 不能是 3 个值。也许它应该是 3 个列表的列表? &lt; 只是名称,因此如果任何两个元素(在您的情况下为列表)应被视为低于右侧,则您传递任何可以返回 #t 的内容。如果只需要&lt;,就像数字一样,你就不会费心要求比较函数了。

标签: sorting functional-programming scheme racket


【解决方案1】:

这应该适用于大多数提供sort 过程的Scheme 方言:

(define (my-sort my-list my-function)
  (sort my-list
        (lambda (l1 l2) (< (my-function l1) (my-function l2)))))

根据docsless-than?任何过程:

获取 lst 的两个元素,如果第一个小于第二个(即应该更早排序),则返回一个真值

这也应该有效,但它是特定于球拍的:

(define (my-sort my-list my-function)
  (sort my-list #:key my-function #:cache-keys? #t <))   

#:key 参数extract-key 用于从每个列表元素中提取一个键值进行比较。

默认情况下,extract-key 应用于每次比较的两个列表元素,但如果 cache-keys? 为真,则 extract-key 函数对每个列表项只使用一次。当 extract-key 是一个昂贵的操作时,为 cache-keys? 提供一个真正的值

【讨论】:

  • 谢谢。我正在使用 HashTable 和辅助列表进行实现,使用哈希表的键对其进行排序并获取哈希表中的元素。
  • 我很高兴能够提供一个更简单的解决方案 ;)
  • 抱歉,我的my-function 有三个参数,列表和另外两个。如何在 sort 调用中传递它们?谢谢。
  • 我已经这样做了:(sort lst #:key (lambda (x) (my-function x y z)) #:cache-keys? #t &lt;)
  • 不,如果需要传递多个参数,则不能使用#:key 解决方案。使用第一个版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2011-01-19
  • 1970-01-01
相关资源
最近更新 更多