Scala сделать вывод списком
object Main {
def main(args: Array[String]): Unit = {
def checkerFunction(list: List[String], numberToCheck: Int): List[Int] = {
@scala.annotation.tailrec
def recursiveFunction(listOfIndex: List[Int], listToCheck: List[String], index: Int): List[Int] = {
if (listToCheck.isEmpty) listOfIndex
else {
val newIndexList =
if (listToCheck.head == numberToCheck.toString) listOfIndex :+ index;
else listOfIndex
recursiveFunction(newIndexList, listToCheck.tail, index + 1)
}
}
recursiveFunction(List(), list, 0)
}
val ls = List("1", "2", "1", "3", "1", "0")
checkerFunction(ls, 1).foreach(println)
}
}
Добрый день, необходимо вывести список из значений. Подскажите пожалуйста, ничего умного в голову не приходит. Задача такова: - Нужно написать это рекурсивно, задание заключается в том, чтобы вывести индекс всех вхождений элемента в списке, вывод тоже в список, желательно работать с числами.
Ответы (2 шт):
Можно использовать pattern matching (три случая: 1) головной элемент списка совпадает с нужным числом, 2) не совпадает, 3) пустой список) и передавать пополняемый список (accumulator) как аргумент рекурсивной функции.
def checkerFunction(list: List[Int], numberToCheck: Int): List[Int] = {
def recursiveFunction(listToCheck: List[Int],
index: Int, accumulator: List[Int]): List[Int] = {
listToCheck match {
case head :: tail if head == numberToCheck =>
recursiveFunction(tail, index + 1, index +: accumulator)
case _ :: tail => recursiveFunction(tail, index + 1, accumulator)
case Nil => accumulator.reverse
}
}
recursiveFunction(list, 0, Nil)
}
Список индексов формируется в обратном порядке и в конце разворачивается. Это эффективнее, чем добавление в конец
accumulator :+ index // так лучше не делать
...
case Nil => accumulator
Для полноты картины, вот как задачу можно решить стандартными средствами:
val indexlist = listToCheck.zipWithIndex.filter(p => p._1 == numberToCheck).map(p => p._2)
zipWithIndex формирует список кортежей вида (элемент_списка, номер_в_списке), далее фильтруются кортежи, где элемент равен numberToCheck, потом из отфильтрованного списка кортежей берём вторые элементы (номера в исходном списке).