如何在方案中将字符串列表转换为一个字符串?

use*_*642 11 string scheme list intermediate-language racket

比如我有(list "a" "1" "b" "2" "c" "3").

现在我想把这个列表变成一个"a1b2c3".

我怎么做?

谢谢.

Wes*_*Wes 12

(apply string-append (list "a" "1" "b" "2" "c" "3"))或者(string-append* "" (list "a" "1" "b" "2" "c" "3"))应该工作.请参阅:http://docs.racket-lang.org/reference/strings.html

如果你想要一个程序来做这个,你可以写 (define (strings->string sts) (apply string-append sts))


Ósc*_*pez 9

不要重新发明轮子!在Racket中,有一个专门用于此的程序,它的名字叫string-join:

(string-join '("a" "1" "b" "2" "c" "3") "")
=> "a1b2c3"
Run Code Online (Sandbox Code Playgroud)

引用文档:

(string-join strs                
             [sep                
              #:before-first before-first                
              #:before-last before-last              
              #:after-last after-last]) ? string?

strs : (listof string?)
sep : string? = " "
before-first : string? = ""
before-last : string? = sep
after-last : string? = ""
Run Code Online (Sandbox Code Playgroud)

将字符串追加到strs中的每对字符串之间strs插入sep.before-last,before-firstafter-last类似于以下内容的输入add-between:它们分别在最后两个字符串,前缀字符串和后缀字符串之间指定备用分隔符.


Las*_*ssi 5

无论如何,这里有一些带有和不带有分隔符的实现(即在每对字符串之间插入一个字符串,例如空格或逗号)。

函数foldfold-right来自 SRFI 1。

当连接非常多或非常长的字符串时,使用字符串端口可能会更快。否则不太可能有太大的速度差异。

没有分隔符参数

使用折叠

(define (string-join strings)
  (fold-right string-append "" strings))
Run Code Online (Sandbox Code Playgroud)

使用递归

(define (string-join strings)
  (let loop ((strings strings) (so-far ""))
    (if (null? strings)
        so-far
        (loop (cdr strings) (string-append so-far (car strings))))))
Run Code Online (Sandbox Code Playgroud)

使用字符串端口

(define (string-join strings)
  (parameterize ((current-output-port (open-output-string)))
    (for-each write-string strings)
    (get-output-string (current-output-port))))
Run Code Online (Sandbox Code Playgroud)

带分隔符参数

使用折叠

(define (string-join strings delimiter)
  (if (null? strings)
      ""
      (fold (lambda (s so-far) (string-append so-far delimiter s))
            (car strings)
            (cdr strings))))
Run Code Online (Sandbox Code Playgroud)

使用递归

(define (string-join strings delimiter)
  (if (null? strings)
      ""
      (let loop ((strings (cdr strings)) (so-far (car strings)))
        (if (null? strings)
            so-far
            (loop (cdr strings)
                  (string-append so-far delimiter (car strings)))))))
Run Code Online (Sandbox Code Playgroud)

使用字符串端口

(define (string-join strings delimiter)
  (if (null? strings)
      ""
      (parameterize ((current-output-port (open-output-string)))
        (write-string (car strings))
        (for-each (lambda (s)
                    (write-string delimiter)
                    (write-string s))
                  (cdr strings))
        (get-output-string (current-output-port)))))
Run Code Online (Sandbox Code Playgroud)