方案:如何找到一个字符在字符串中的位置
Scheme: How to find a position of a char in a string
我正在尝试查找等于某个字符的字符串的索引,但我似乎可以弄清楚。
这是我到目前为止得到的,但它不起作用...
(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)))))))
解决方案很简单:我们必须测试列表中的每个字符,直到我们 运行 没有元素或者我们找到第一次出现的字符,跟踪我们所在的位置。
你提出的解决方案看起来很奇怪,在 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
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
我正在尝试查找等于某个字符的字符串的索引,但我似乎可以弄清楚。 这是我到目前为止得到的,但它不起作用...
(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)))))))
解决方案很简单:我们必须测试列表中的每个字符,直到我们 运行 没有元素或者我们找到第一次出现的字符,跟踪我们所在的位置。
你提出的解决方案看起来很奇怪,在 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
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