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
  }