Scala — список с конца (проблема с запятыми)

#scala

#scala

Вопрос:

Я должен печатать элементы списка с конца с запятыми между ними и без запятой в конце. Код:

 val daysList = List("Poniedzialek", "Wtorek", "Sroda", "Czwartek", "Piatek", "Sobota", "Niedziela")

 def recurencyListReverse(days:List[String], twoB:String):String =
  {
    if (days.nonEmpty) return recurencyListReverse(days.tail, days.head   ", "   twoB)
    return twoB
  }
  println("Zadanie 2B)")
  println(recurencyListReverse(daysList, ""))
  

Есть идеи?

Комментарии:

1. Вы можете просто сделать daysList.reverse.mkString(", ")

2. Извините, я не упомянул, что это должно быть сделано с помощью функции возврата

3. @sinanspd еще лучше daysList.reverseIterator.mkString(", ")

4. @mnrater хвостовая рекурсия и сопоставление с образцом, это должно быть довольно перспективно, и, пожалуйста, не используйте return .

Ответ №1:

Базовая рекурсия.

 def recurencyListReverse(days:List[String]):String = days match {
  case day :: Nil => day
  case day :: tail => recurencyListReverse(tail)   s", $day"
  case _ => ""
}
  

Если вы хотите, чтобы он был рекурсивным.

 def recurencyListReverse(days:List[String]):String = {
  @annotation.tailrec
  def loop(ds: List[String], connect:String, acc:String):String =
    if (ds.isEmpty) acc
    else loop(ds.tail, ", ", ds.head   connect   acc)
  loop(days, "", "")
}
  

Ответ №2:

Если вам это нужно только для «печати» mkString() , должно быть достаточно.

 scala> daysList.mkString(", ")
res1: String = Poniedzialek, Wtorek, Sroda, Czwartek, Piatek, Sobota, Niedziela

scala> daysList.reverse.mkString(", ")
res2: String = Niedziela, Sobota, Piatek, Czwartek, Sroda, Wtorek, Poniedzialek
  

Комментарии:

1. Я не думаю, что в моей командной строке есть польские диакритические знаки, но они доступны в Scastie: scastie.scala-lang.org/W9kqMgzYQfOBmTjRkPJakw