Scala обратная строка
Я новичок в scala, я просто пишу простую функцию для изменения данной строки:
def reverse(s: String) : String
for(i <- s.length - 1 to 0) yield s(i)
выход возвращает обратно scala.collection.immutable.IndexedSeq [Char] и не может преобразовать его в String. (или это что-то еще?)
как я могу написать эту функцию?
Ответы
Ответ 1
Обратите внимание, что уже определена функция:
scala> val x = "scala is awesome"
x: java.lang.String = scala is awesome
scala> x.reverse
res1: String = emosewa si alacs
Но если вы хотите сделать это самостоятельно:
def reverse(s: String) : String =
(for(i <- s.length - 1 to 0 by -1) yield s(i)).mkString
или (иногда лучше использовать until
, но, вероятно, не в этом случае)
def reverse(s: String) : String =
(for(i <- s.length until 0 by -1) yield s(i-1)).mkString
Также обратите внимание, что если вы используете обратный подсчет (от большего к меньшему одному значению), вы должны указать отрицательный шаг или вы получите пустой набор:
scala> for(i <- x.length until 0) yield i
res2: scala.collection.immutable.IndexedSeq[Int] = Vector()
scala> for(i <- x.length until 0 by -1) yield i
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
Ответ 2
Здесь короткая версия
def reverse(s: String) = ("" /: s)((a, x) => x + a)
изменить
: или даже короче, у нас есть фантастически загадочный
def reverse(s: String) = ("" /: s)(_.+:(_))
но я бы не рекомендовал это...
Ответ 3
Как указано om-nom-nom, обратите внимание на by -1
(иначе вы на самом деле не итерируете, и ваш результат будет пустым). Другой трюк, который вы можете использовать, - collection.breakOut
.
Он также может быть предоставлен понятию for
следующим образом:
def reverse(s: String): String =
(for(i <- s.length - 1 to 0 by -1) yield s(i))(collection.breakOut)
reverse("foo")
// String = oof
Преимущество использования breakOut
заключается в том, что он избежит создания промежуточной структуры, как в решении mkString
.
note: breakOut
использует CanBuildFrom
и сборщики, которые являются частью основы переработанной библиотеки коллекций, представленной в scala 2.8.0
Ответ 4
Вы также можете написать это, используя рекурсивный подход (бросая это только для удовольствия)
def reverse(s: String): String = {
if (s.isEmpty) ""
else reverse(s.tail) + s.head
}
Ответ 5
Все приведенные выше ответы верны, и вот мое взятие:
scala> val reverseString = (str: String) => str.foldLeft("")((accumulator, nextChar) => nextChar + accumulator)
reverseString: String => java.lang.String = <function1>
scala> reverseString.apply("qwerty")
res0: java.lang.String = ytrewq
Ответ 6
def rev(s: String): String = {
val str = s.toList
def f(s: List[Char], acc: List[Char]): List[Char] = s match {
case Nil => acc
case x :: xs => f(xs, x :: acc)
}
f(str, Nil).mkString
}