【问题标题】:Scala: get list with the first element of three lists not repeating any elementScala:获取三个列表的第一个元素不重复任何元素的列表
【发布时间】:2017-05-28 08:21:33
【问题描述】:

我有一个带有以下元素的 scala List[List[Person]]

Person(Antonio)
Person(Maria)
Person(Joao)

Person(Antonio)
Person(Susana)
Person(Laura)

Person(Maria)
Person(Manuel)
Person(Joao)
Person(Laura)

如何获得每个列表的第一个元素不重复的列表?像这样:

Person(Antonio)
Person(Susana)
Person(Maria)

var's 很容易做到,但我想在功能上做到这一点。

【问题讨论】:

    标签: scala list functional-programming


    【解决方案1】:
    val l: List[List[Person]] = ...
    
    l.foldLeft(List.empty[Person]) { case (acc, el) => 
      el.find(x => !acc.contains(x)).fold(acc)(acc.::)
    }
    

    【讨论】:

    • 这不太对。不是返回Person(Antonio)/Person(Susana)/Person(Maria),而是返回Person(Antonio)/Person(Maria)
    • 我明白了,我没有从你的描述中得到那个...更新
    • 折叠选项有点不寻常,不是吗?也许acc ++ el.find(x => !acc.contains(x)).toList
    • Joe K 的想法也行之有效。使用 Olivier 的解决方案,我必须反转结果列表才能获得正确的顺序,而使用 Joe 的调整,我不必这样做。
    • 卓越的解决方案。我只想补充一点,外部的foldLeft 也可以替换为fold,以获得更好的parallelization
    【解决方案2】:

    我能够通过递归和foldLeft

    val allLists: List[List[Person]] = ...
    
    allLists.foldLeft(List.empty[Person]){ case(outputList, list) =>
      def loop(innerList: List[Person], newPerson: Person): Person = {
        if(innerList.isEmpty) newPerson
        else if(!outputList.contains(innerList.head)) newPerson
        else loop(innerList.tail, innerList.tail.head)
      }
    
      outputList :+ loop(list, list.head)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      相关资源
      最近更新 更多