Как удалить дубликаты из списка, не используя встроенные библиотеки, такие как Different, groupBy (identity), toSet .. и т. Д. - PullRequest
0 голосов
/ 04 декабря 2018

Я хотел написать Scala-программу, которая принимает аргументы командной строки в качестве ввода списка и предоставляет список вывода без дубликатов.Я хочу знать пользовательскую реализацию этого без использования каких-либо библиотек.

Ввод: 4 3 7 2 8 4 2 7 3 Выход: 4 3 7 2 8

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вот способ, которым вы могли бы сделать это, используя рекурсию.Я попытался изложить его так, чтобы его было проще объяснить:

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 - каким-то образом, поэтому выкладывая это так, я могу представить себе, что происходит, когда я пытаюсь выработать логику.

0 голосов
/ 04 декабря 2018
val x= List(4, 3, 7, 2, 8, 4, 2, 7, 3)
x.foldLeft(List[Int]())((l,v)=> if (l.contains(v)) l else  v :: l)

если вы не можете использовать содержимое, вы можете сделать еще один сброс

x.foldLeft(List[Int]())((l,v)=> if (l.foldLeft(false)((contains,c)=>if (c==v ) contains | true else contains | false)) l else  v :: l)
...