我想在列表中保存点(X,Y)的坐标。此外,我想每次在该列表中添加点时按X或Y值对列表进行排序。
我该怎么做?
提前致谢。
答案 0 :(得分:4)
您可以通过多种方式在Scheme中执行此操作。在这个答案中,我将使用PLT Scheme(如您的标签所示)。我将链接到PLT计划documentation,您可以在其中阅读有关这些内容的更多信息。
首先,我们可以define a point structure。
(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}坐标到sort点列表:
(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
是一个有序的点列表。