【问题标题】:How to remove duplicates from list without using in inbuilt libraries such as distinct, groupBy(identity), toSet.. Etc如何在不使用内置库(例如 distinct、groupBy(identity)、toSet.. 等)的情况下从列表中删除重复项
【发布时间】:2018-12-04 05:31:07
【问题描述】:

我想编写一个 Scala 程序,它将命令行参数作为列表输入并提供不重复的输出列表。 我想知道这个的自定义实现而不使用任何库。

输入:4 3 7 2 8 4 2 7 3 输出:4 3 7 2 8

【问题讨论】:

  • 您认为可以接受哪些标准库方法? foldLeft?那么类型(ListSet)呢?另外,到目前为止,您尝试过什么?
  • 我必须知道,为什么不使用 toSetdistinct 之类的东西?
  • 在没有内部库的情况下手动编写代码是一项任务。我是 scala 新手
  • 啊,很公平。如果你看到我的回答,你可以用递归很好地做到这一点。

标签: scala logic scala-collections


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    这是一种使用递归的方法。我试图以一种最容易解释的方式来阐述它:

    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)
    

    这个函数接受两个参数,inout,并遍历in 列表中的每个元素,直到它为空(通过使用intail 调用自身)。一旦in 为空,函数就会输出out 列表。

    如果 out 列表不包含您当前正在查看的 in 的值,则该函数使用 in 的尾部调用自身,并将 in 的值添加到末尾out 列表。

    如果out 确实包含您当前正在查看的in 的值,它只会使用in 的尾部和当前的out 列表调用自身。

    注意:这是 Arnon 提出的 fold 方法的替代方法。我个人会编写一个像我这样的函数,然后在必要时将其重构为 fold 函数。我自然不会以一种功能性的、fold-y 的方式思考,所以像这样布置它有助于我在试图找出逻辑时想象正在发生的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多