我想编写一个程序,将一个流(数据流)中的项目重新排列为另一个流(订单流)指定的顺序,该流程由指定所需顺序的项目编号组成。
例如,如果数据流以4,13,2,8开头,并且订单流以3,1,4,2开始,则结果流将以2,4,8,13开始。(第一个结果的项目是数据的第三项,结果的第二项是数据的第一项,依此类推。)
我到目前为止......
(define (reorder order-stream data-stream)
(cond ((stream-null? order-stream) the-empty-stream)
((stream-null? data-stream) the-empty-stream)
(else (cons-stream (stream-ref order-stream data-stream))))
(define (stream-ref s n)
(if (= n 0)
(stream-car s)
(stream-ref (stream-cdr s) (- n 1))))
但是,输出并不像预期的那样。
答案 0 :(得分:1)
使用Racket流。
请注意
(stream-ref data-stream (stream-first order-stream))
将使用订单流的第一个元素来挑选数据流的元素。
另请注意,除非数据流支持随机访问,否则我们将会变慢。
#lang racket
(require racket/stream)
(define (reorder order-stream data-stream)
(cond ((stream-empty? order-stream) empty-stream)
(else (stream-cons (stream-ref data-stream (stream-first order-stream))
(reorder (stream-rest order-stream) data-stream)))))
(define ones (stream-cons 1 ones))
(define (stream-add s1 s2)
(stream-cons (+ (stream-first s1) (stream-first s2))
(stream-add (stream-rest s1) (stream-rest s2))))
(define fibonacci (stream-cons 1 (stream-cons 1 (stream-add fibonacci (stream-rest fibonacci)))))
(for/list ([x fibonacci] [n 10]) x) ; '(1 1 2 3 5 8 13 21 34 55)
(for/list ([x (reorder '(3 1 4 2 10) fibonacci)]) x) ; '(3 1 5 2 89)