Вот способ, которым вы могли бы сделать это, используя рекурсию.Я попытался изложить его так, чтобы его было проще объяснить:
import scala.annotation.tailrec
@tailrec
def getIndividuals(in: List[Int], out: List[Int] = List.empty): List[Int] = {
if(in.isEmpty) out
else if(!out.contains(in.head)) getIndividuals(in.tail, out :+ in.head)
else getIndividuals(in.tail, out)
}
val list = List(1, 2, 3, 4, 5, 4, 3, 5, 6, 0, 7)
val list2 = List(1)
val list3 = List()
val list4 = List(3, 3, 3, 3)
getIndividuals(list) // List(1, 2, 3, 4, 5, 6, 0, 7)
getIndividuals(list2) // List(1)
getIndividuals(list3) // List()
getIndividuals(list4) // List(3)
Эта функция принимает два параметра in
и out
и выполняет итерацию по каждому элементу в списке in
пока он не пуст (вызывая себя с tail
из in
).Если in
пусто, функция выводит список out
.
Если в списке out
нет значения in
, которое вы просматриваете в данный момент, функция вызывает себя схвост in
и с этим значением in
, добавленным в конец списка out
.
Если out
содержит содержит значение in
, то выв настоящее время смотрят, он просто вызывает себя с хвостом in
и текущим out
списком.
Примечание: Это альтернатива методу fold
, который Арнонпредложил.Лично я написал бы такую функцию, как моя, а затем, если необходимо, мог бы преобразовать ее в функцию fold
.Я, естественно, не думаю функционально, fold
- каким-то образом, поэтому выкладывая это так, я могу представить себе, что происходит, когда я пытаюсь выработать логику.