0

我还在为这些 zipWithIndex 和 filter 函数苦苦挣扎。我有这个代码语句,并添加了一个测试字符串以与其余代码隔离。

val s = "012345678901234567890123456789012345678901234567890123456789"
val l = s.zipWithIndex.filter{tuple => tuple._2 % 4 == 0}.map{_._1}.toString()

我曾期望从原始字符串中每隔 5 个字符得到一个字符串,这确实发生了。相反,我得到的是:

 Vector(0, 4, 8, 2, 6, 0, 4, 8, 2, 6, 0, 4, 8, 2, 6)

由于某种原因,它似乎添加了空格,以及Vector字符串中的单词。那是从哪里来的?它在那里没有.toString()(那是为了稍后更改类型)。更重要的是,我该如何预防呢?

4

3 回答 3

2

要加入一系列字符,您可以使用mkString

scala> Vector('1', '2').mkString
res0: String = "12"

在你的情况下:

val l = s.zipWithIndex.filter{tuple => tuple._2 % 4 == 0}.map{_._1}.mkString

在这里,您使用.toString()which 是用于表示对象是什么的常用方法。在这种情况下,一个 Vector 及其内容:

scala> Vector('1', '2').toString
res1: String = "Vector(1, 2)"
于 2018-06-03T16:58:26.777 回答
2

您需要明确加入向量的成员,而不是调用toString. 你可以用mkString这个。这是一个完整的工作示例:

val s = "012345678901234567890123456789012345678901234567890123456789"
val l = s.zipWithIndex.filter{tuple => tuple._2 % 4 == 0}.map{_._1}.mkString
于 2018-06-03T16:58:33.697 回答
1

上面已经有用于连接数据结构的答案。mkString("")List

您可能想使用Range而不是zipWithIndex只对字符串进行一次遍历。

scala> val s = "012345678901234567890123456789012345678901234567890123456789"
s: String = 012345678901234567890123456789012345678901234567890123456789

scala> (0 until s.length by 4).map(index => s(index)).mkString("")
res1: String = 048260482604826

因为底层java.lang.String维护了一个数组,这意味着O(1)检索

private final char value[];

public char charAt(int index) {
    if ((index < 0) || (index >= value.length)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index];
}

无论如何它是 fp,所以你可能不关心空间/时间。

于 2018-06-03T17:09:31.507 回答