如何一次懒惰地处理两个字符串?
How to process lazily two strings at once?
假设我需要一个函数来从字符串 str
中过滤掉 chars
的字符,然后只从结果中取出 k
个字符:
def cleanTrim(str: String, chars: Set[Char], k: Int): String =
str.filterNot(chars).take(k)
这个实现不是最理想的,因为它不必要地扫描整个字符串。为了优化它,我们可以使用 view
或事件 Stream
来延迟扫描输入,例如:
def cleanTrim(str: String, chars: Set[Char], k: Int): String =
str.view.foldLeft("") { case (r, c) => if (chars.contains(c)) r + c else r }.take(k)
假设现在我需要清理 trim 懒惰 两个 字符串。我想 fold
他们懒惰地同时处理来自他们两个的单个字符并且 return 两个结果。
def cleanTrim2(str1: String,
str2: String,
chars: Set[Char],
k: Int): (String, String) = ???
您建议如何实施?
我看不到使用懒惰有任何好处。在 cleanTrim
的第二个实现中,您仍然扫描整个字符串,实际上,如果不扫描整个字符串(或流或视图)就无法检查字符串 contains
是否为字符。
UPD:@thwiegan 对,我没有仔细阅读问题。
UPD2:好的,我的第二次尝试,不知道你使用fold
是否重要,但我看到了更清楚的方法:
def cleanTrim2(str1: String, str2: String, chars: Set[Char], k: Int): (String, String) = {
val result1 = str1.iterator.filterNot(chars).take(k).mkString
val result2 = str2.iterator.filterNot(chars).take(k).mkString
(result1, result2)
}
假设我需要一个函数来从字符串 str
中过滤掉 chars
的字符,然后只从结果中取出 k
个字符:
def cleanTrim(str: String, chars: Set[Char], k: Int): String =
str.filterNot(chars).take(k)
这个实现不是最理想的,因为它不必要地扫描整个字符串。为了优化它,我们可以使用 view
或事件 Stream
来延迟扫描输入,例如:
def cleanTrim(str: String, chars: Set[Char], k: Int): String =
str.view.foldLeft("") { case (r, c) => if (chars.contains(c)) r + c else r }.take(k)
假设现在我需要清理 trim 懒惰 两个 字符串。我想 fold
他们懒惰地同时处理来自他们两个的单个字符并且 return 两个结果。
def cleanTrim2(str1: String,
str2: String,
chars: Set[Char],
k: Int): (String, String) = ???
您建议如何实施?
我看不到使用懒惰有任何好处。在 cleanTrim
的第二个实现中,您仍然扫描整个字符串,实际上,如果不扫描整个字符串(或流或视图)就无法检查字符串 contains
是否为字符。
UPD:@thwiegan 对,我没有仔细阅读问题。
UPD2:好的,我的第二次尝试,不知道你使用fold
是否重要,但我看到了更清楚的方法:
def cleanTrim2(str1: String, str2: String, chars: Set[Char], k: Int): (String, String) = {
val result1 = str1.iterator.filterNot(chars).take(k).mkString
val result2 = str2.iterator.filterNot(chars).take(k).mkString
(result1, result2)
}