Scala 惰性地将包含单词的字符串转换为单词流
给定一个包含单词和空格(如“aaa-bbb-ccc-ddd”)的字符串,您是否可以将其惰性地转换为一个流,该流将字符串按空格(如stream(“aaa”),进行拆分?首先需要创建迭代器吗?这可能是一个javish解决方案,但可能适合您的需要。您可以利用java.util.Scanner也是迭代器这一事实(尽管它是java迭代器) 上述代码几乎可以写成一行:Scala 惰性地将包含单词的字符串转换为单词流,scala,Scala,给定一个包含单词和空格(如“aaa-bbb-ccc-ddd”)的字符串,您是否可以将其惰性地转换为一个流,该流将字符串按空格(如stream(“aaa”),进行拆分?首先需要创建迭代器吗?这可能是一个javish解决方案,但可能适合您的需要。您可以利用java.util.Scanner也是迭代器这一事实(尽管它是java迭代器) 上述代码几乎可以写成一行: import scala.collection.JavaConverters._ import java.util.Scanner val
import scala.collection.JavaConverters._
import java.util.Scanner
val stream = new Scanner(str).useDelimiter(" ").asScala.toStream
在查看scaladocs之后,这里有一个解决方案应该可以工作。为了模拟string的
split(regex:string,limit:Int)
函数,需要单独处理边缘情况,例如1和0
def wordStream(s: String): Stream[String] = {
def loop(offset: Int): Stream[String] = {
val substring = s.substring(offset)
val preWhitespace = substring.takeWhile(_.isWhitespace).size
val word = s.substring(preWhitespace).takeWhile(c => !c.isWhitespace)
word #:: {
val newOffset = offset + preWhitespace + word.length
if (newOffset >= raw.length) Stream.empty
else loop(newOffset)
}
}
loop(0)
}
“这将触发从java迭代器到Scala one的转换”真的吗<代码>Java转换器。使用了,因此需要调用
asScala
来执行转换(就像在上一个示例中一样)。@VladimirMatveev当然,我在范围内有Java转换,所以我把它们弄糊涂了
def wordStream(s: String): Stream[String] = {
def loop(offset: Int): Stream[String] = {
val substring = s.substring(offset)
val preWhitespace = substring.takeWhile(_.isWhitespace).size
val word = s.substring(preWhitespace).takeWhile(c => !c.isWhitespace)
word #:: {
val newOffset = offset + preWhitespace + word.length
if (newOffset >= raw.length) Stream.empty
else loop(newOffset)
}
}
loop(0)
}