我试图找到一个字符串的索引,它等于一个特定的字符,但我似乎可以搞清楚。 这是我到目前为止所得到的,但它不起作用......
(define getPos
(lambda ()
(define s (apply string-append myList))
(getPosition pos (string->list s))))
(define getPosition
(lambda (position s)
(if (and (< position (length s)) (equal? (car s) #\space))
((set! pos (+ pos 1)) (getPosition (cdr s) pos));increment the positon and continue the loop
pos)));else
(define length
(lambda (s);the value s must be coverted to a string->list when passed in
(cond
((null? s) 0)
(else (+ 1 (length (cdr s)))))))
答案 0 :(得分:2)
解决方案很简单:我们必须测试列表中的每个char,直到我们用完元素或者找到char的第一个匹配项,跟踪我们所处的位置。
你提出的解决方案看起来很奇怪,在Scheme中我们试图避免set!
和其他改变数据的操作 - 要走的路,就是使用递归来遍历字符列表。这样的事情是首选:
(define (getPosition char-list char pos)
(cond ((null? char-list) #f) ; list was empty
((char=? char (car char-list)) pos) ; we found it!
(else (getPosition (cdr char-list) char (add1 pos))))) ; char was not found
对于基于0的索引,请像这样使用它,将字符串转换为字符列表并初始化0
中的位置:
(getPosition (string->list "abcde") #\e 0)
=> 4
当然,我们可以通过使用现有程序做得更好 - 这是一个更惯用的解决方案:
(require srfi/1) ; required for using the `list-index` procedure
(define (getPosition string char)
(list-index (curry char=? char)
(string->list string)))
(getPosition "abcde" #\e)
=> 4
答案 1 :(得分:0)
for
的解决方案:
#lang racket
(define (find-char c s)
(for/first ([x s] ; for each character in the string c
[i (in-naturals)] ; counts 0, 1, 2, ...
#:when (char=? c x))
i))
(find-char #\o "hello world")
(find-char #\x "hello world")
输出:
4
#f