0
포인트 (X, Y)의 좌표를리스트에 저장하고 싶습니다. 또한 목록에 포인트를 추가 할 때마다 X 또는 Y 값으로 목록을 정렬하려고합니다.체계의 점 (점)을 저장하고 정렬하는 방법은 무엇입니까?
어떻게하면됩니까?
미리 감사드립니다.
포인트 (X, Y)의 좌표를리스트에 저장하고 싶습니다. 또한 목록에 포인트를 추가 할 때마다 X 또는 Y 값으로 목록을 정렬하려고합니다.체계의 점 (점)을 저장하고 정렬하는 방법은 무엇입니까?
어떻게하면됩니까?
미리 감사드립니다.
Scheme에서 여러 가지 방법을 사용할 수 있습니다. 이 답변에서 나는 귀하의 태그가 제안한대로 PLT Scheme을 사용할 것입니다. PLT Scheme 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))
가 Y로 sort에 3
에 지점의 목록을 평가 좌표
(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
함수는 두 개의 선택적 인수를 취합니다.
이 기능는 다음과 같이 사용할 수 있습니다
plist
포인트의 정렬 된 목록입니다
> (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))
.
멋진! 고마워, 조나스. 훌륭한 설명! 전 plt-scheme에서 매우 새로 생겼습니다. 제 생각에 (개인적으로) 스킴 책이나 문서는 처음부터 시작해야하며, 요구 사항에 따라 무작위로 날 수는 없다고 생각합니다. 의사 링크로 안내 할 수 있다면 더 좋을 것입니다. 그건 내가 궤도에 있고 다음 질문을하기 전에 의사를 시도하는 데 도움이됩니다 :) – fireball003
죄송합니다, 나는 당신의 의견을 읽기 전에 내 대답을 꽤 바꿨습니다. 원래 답변으로 되돌아 가야합니까? – Jonas
Nop, 괜찮아 ... 이미 그 코드를 사용해 봤어. 그래서 그들은 이미 여기에 :) 나는 그것이 "죄수"와 단 한 줄로 할 수 있다고 생각. 매번 포인트를 추가하는 동안 정렬하는 것처럼 ... 다음 줄과 같이 - "(cond [(마우스 =?"그래서"sort (w x) "와 같은 cons 메소드 후에 할 수 있습니까? – fireball003