我想将点 (X,Y) 的坐标保存在列表中。另外,每次在列表中添加点时,我想按 X 或 Y 值对列表进行排序。

我怎样才能做到这一点?

提前致谢。

有帮助吗?

解决方案

在Scheme 中,您可以通过多种方式执行此操作。在这个答案中我将使用 PLT方案 (正如你的标签所建议的)。我将提供 PLT 方案的链接 文档 您可以在其中阅读有关这些内容的更多信息。

首先我们可以 定义点结构.

 (define-struct point (x y) #:transparent)

这个简单的定义将自动创建许多有用的函数,我们可以在处理我们的点时使用它们

  • (make-point 3 4) 将创建一个坐标为 (3,4) 的新点
  • (point-x <some-point>) 返回 x 坐标,例如。 (point-x (make-point 3 4)) 评估为 3

种类 按 y 坐标列出的点列表:

(define (sort-by-y lst)
  (sort lst
        <
        #:key point-y))

如果您想在执行以下操作时保持列表排序 insert 一个新点你可以做类似的事情

(define (insert x xs #:predicate (p <) #:key (k (lambda (x) x)))
   (if (null? xs)
       (list x)
       (let ((y (car xs)))
         (if (p (k x) (k y))
             (cons x xs)
             (cons y (insert x 
                             (cdr xs) 
                             #:predicate p 
                             #:key k))))))

insert 函数有两个可选参数:

  • 谓词函数,可用于根据不同的顺序对列表进行排序(默认为 <)
  • 可用于从某些结构中提取元素的关键函数(默认为恒等函数)

这个函数可以这样使用:

> (insert 3 (list 1 2 4 5 6))
(1 2 3 4 5 6)

> (insert (make-point 3 5) plist #:key point-y)
(#(struct:point 2 1) 
 #(struct:point 9 2) 
 #(struct:point 1 3) 
 #(struct:point 3 5) 
 #(struct:point 6 6))

> (insert (make-point 3 5) (reverse plist) #:predicate > #:key point-y)
(#(struct:point 6 6) 
 #(struct:point 3 5) 
 #(struct:point 1 3) 
 #(struct:point 9 2) 
 #(struct:point 2 1))

在哪里 plist 是点的排序列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top