zipWithIndex и фильтр, приводящий к строке «Vector» в выводе - PullRequest
0 голосов
/ 03 июня 2018

Я все еще немного борюсь с этими функциями zipWithIndex и фильтрами.У меня есть этот оператор кода, и я добавил тестовую строку, чтобы изолировать от остальной части кода.

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() (который должен был изменить тип на потом).И, что более важно, как я могу предотвратить это?

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

Вам нужно явно присоединиться к членам векторов, вместо того, чтобы вызывать toString.Для этого вы можете использовать mkString.Вот полный рабочий пример:

val s = "012345678901234567890123456789012345678901234567890123456789"
val l = s.zipWithIndex.filter{tuple => tuple._2 % 4 == 0}.map{_._1}.mkString
0 голосов
/ 03 июня 2018

Уже есть ответ выше для использования 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) дляretrieval

private final char value[];

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

это fp в любом случае, поэтому вы можете не заботиться о пространстве / времени.

0 голосов
/ 03 июня 2018

Чтобы присоединить последовательность символов, вы можете использовать mkString:

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

в вашем случае:

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

Здесь вы используете.toString() - это обычный метод, используемый для представления объекта.В данном случае Вектор и его содержание:

scala> Vector('1', '2').toString
res1: String = "Vector(1, 2)"
...