Scheme:如何在字符串中查找char的位置

时间:2015-04-20 01:31:09

标签: string list position scheme racket

我试图找到一个字符串的索引,它等于一个特定的字符,但我似乎可以搞清楚。 这是我到目前为止所得到的,但它不起作用......

(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)))))))

2 个答案:

答案 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