可以使用diff
代替slice
:
list.map(set => set diff (list diff List(set)).flatten.toSet)
//Alternative with filterNot
list.map(set => set.filterNot((list diff List(set)).flatten.contains))
diff
作品在這裏,因爲它僅刪除元素的一個實例,並Set[Int]
有一個很好的equals
方法:
List(Set(1), Set(1, 2)) diff List(Set(1)) //List(Set(1, 2))
List(Set(1), Set(1)) diff List(Set(1)) //List(Set(1))
所以,這將一組圖映射到列表中所有其他組的列表:
val setWithOthers = list.map(set => set -> (list diff List(set)))
val setWithOthers = (list, list.map(list diff List(_))).zipped.toList //equivalent, less efficient
所以,如果你想你的映射跨list
元素功能f
,你可以這樣做:
setsWithOthers.map { case(set, others) => f(set, others) }
setsWithOthers.map(kvp => f(kvp._1, kvp._2))
setsWithOthers.map((f _).tupled)
您還可以創建完整的多集,其跟蹤的每一個元素出現了多少次。然後,在每次循環,可以從滿多集「減」一組:
val multiset = list.flatten.groupBy(identity).mapValues(_.length)
這是比使用切片漂亮的數量級,但它仍然不是我所希望的。 (我的失望是針對scala,而不是你的回答) – 2015-03-30 22:48:22
hehe你用我更好的版本更新了我的想法。地圖方法是我接受的答案。 – 2015-03-30 22:58:06