2017-05-27 46 views
1

我有一个阶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,但我想在功能上做到这一点。

回答

2
val l: List[List[Person]] = ... 

l.foldLeft(List.empty[Person]) { case (acc, el) => 
    el.find(x => !acc.contains(x)).fold(acc)(acc.::) 
} 
+0

这是不完全正确。而不是返回'人(安东尼奥)/人(苏珊娜)/人(玛丽亚)'它正在返回'人(安东尼奥)/人(玛丽亚)' –

+0

我看,我没有从你的描述得到...更新 – OlivierBlanvillain

+1

折叠选项有点不寻常,不是吗?也许'acC++ el.find(x =>!acc.contains(x))。toList'? –

0

我能够用递归和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) 
}