Печать символов с четными и нечетными индексами из строки - PullRequest
1 голос
/ 13 января 2020

Используя scala, как напечатать строку в четных и нечетных индексах данной строки? Я знаю об императивном подходе, используя var. Я ищу подход, который использует неизменяемость, избегает побочных эффектов (конечно, пока не нужно печатать результат) и лаконичен.

Ответы [ 4 ]

3 голосов
/ 14 января 2020

Вы можете использовать функцию sliding, которая довольно проста:

scala> "abcdefgh".sliding(1,2).mkString("")
res16: String = aceg

scala> "abcdefgh".tail.sliding(1,2).mkString("")
res17: String = bdfh
3 голосов
/ 13 января 2020

Другой способ исследования - использование zipWithIndex

def printer(evenOdd: Int) {
    val str = "1234"
    str.zipWithIndex.foreach { i =>
      i._2 % 2 match {
        case x if x == evenOdd => print(i._1)
        case _ =>
      }
    }
  }

. В этом случае вы можете проверить результаты с помощью функции принтера

scala> printer(1)
24
scala> printer(0)
13

.zipWithIndex занимает List и возвращает кортежи элементов в сочетании с их индексом. Зная, что String - это список Char

Глядя на str

scala> val str = "1234"
str: String = 1234

str.zipWithIndex
res: scala.collection.immutable.IndexedSeq[(Char, Int)] = Vector((1,0), (2,1), (3,2), (4,3))

Наконец, вам нужно только печатать, используя foreach вместо map более идеален, так как вы не ожидаете возврата значений

3 голосов
/ 13 января 2020

Вот хвосто-рекурсивное решение, возвращающее четные и нечетные символы (List[Char], List[Char]) в одном go

def f(in: String): (List[Char], List[Char]) = {
  @tailrec def run(s: String, idx: Int, accEven: List[Char], accOdd: List[Char]): (List[Char], List[Char]) = {
    if (idx < 0) (accEven, accOdd)
    else if (idx % 2 == 0) run(s, idx - 1, s.charAt(idx) :: accEven, accOdd)
    else run(s, idx - 1, accEven, s.charAt(idx) :: accOdd)
  }
  run(in, in.length - 1, Nil, Nil)
}

, которые можно напечатать так:

val (even, odd) = f("abcdefg")
println(even.mkString)
2 голосов
/ 13 января 2020
val s = "abcd"
// ac
(0 until s.length by 2).map(i => s(i))
// bd
(1 until s.length by 2).map(i => s(i))

просто чистые функции с оператором карты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...