我想在Scala中编写一个返回列表中唯一值的函数。
例如:
unique(List("a", "b", "b", "abba", "abba", "abba", "a", "a", "y", "1"))
//> res6: List[String] = List(y, 1)
我在另一篇文章中发现了一个很好的功能,但它并没有完全符合我的要求,它还返回“a”,“b”和“abba”,我只想要“y”和“1”:< / p>
def keepUnique[A](ls: List[A]) = {
def loop(set: Set[A], ls: List[A]): List[A] = ls match {
case hd :: tail if set contains hd => loop(set, tail)
case hd :: tail => hd :: loop(set + hd, tail)
case Nil => Nil
}
loop(Set(), ls)
}
有谁知道如何调整此功能以使其按照我想要的方式工作?
答案 0 :(得分:3)
这样可行:
scala> List("a", "b", "b", "abba", "abba", "abba", "a", "a", "y", "1")
.flatten.groupBy(identity).filter(_._2.size == 1).map(_._1)
res5: collection.immutable.Iterable[Char] = List('1', 'y')
你的问题有点不清楚,因为你不想要这个列表中的唯一值
List("a", "b", "b", "abba", "abba", "abba", "a", "a", "y", "1")
而是来自这个
List('a', 'b', 'b', 'a', 'b', 'b', 'a', 'a', 'b', 'b', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'y', '1')
答案 1 :(得分:1)
这个怎么样:
scala> List("a", "b", "b", "abba", "abba", "abba", "a", "a", "y", "1")
.map(_.toString).flatten.toSet
res8: scala.collection.immutable.Set[Char] = Set(a, b, y, 1)
编辑: 所以对于独特的,我想你可以修改为:
scala> List("a", "b", "b", "abba", "abba", "abba", "a", "a", "y", "1")
.map(_.toString).flatten.groupBy(identity).filter(_._2.size == 1).map(_._1)
res11: scala.collection.immutable.Iterable[Char] = List(1, y)
答案 2 :(得分:0)
更简单一点:
scala> List("a", "b", "b", "abba", "abba", "abba", "a", "a", "y", "1")
.groupBy(identity).values.filter(_.size ==1).flatten
res3: Iterable[String] = List(y, 1)