我有以下列表:
val list = List(("name1",20),("name2",20),("name1",30),("name2",30),
("name3",40),("name3",30),("name3",20))
我想要关注输出:
List(("name3",40))
我试过以下:
val distElements = list.map(_._2).distinct
list.groupBy(_._1).map{ case(k,v) =>
val h = v.map(_._2)
if(distElements.equals(h)) List.empty else distElements.diff(h)
}.flatten
但这不是我要找的。 p>
任何人都可以给出答案/提示我获得预期的输出。
答案 0 :(得分:1)
在我看来,你想要同时匹配左手和右手的价值,同时还要保留你正在看的收藏类型,列表。我会使用collect
:
val out = myList.collect{
case item @ ("name3", 40) => item
}
结合了PartialFunction
与filter
和map
类似的品质。在这种情况下,它会在映射匹配的值时过滤掉未定义PartialFunction
的任何值。在这里,我只允许进行单一的比赛。
答案 1 :(得分:1)
我理解这个问题是查找_2
(数字)只出现一次的列表元素。
val list = List(("name1",20),("name2",20),("name1",30),("name2",30),
("name3",40),("name3",30),("name3",20))
首先按_2
元素进行分组,该元素为您提供一个地图,其中的键是具有相同_2
的所有元素的列表:
val g = list.groupBy(_._2) // Map[Int, List[(String, Int)]]
现在,您可以过滤仅包含一个元素的条目:
val opt = g.collectFirst { // Option[(String, Int)]
case (_, single :: Nil) => single
}
或者(如果您期望可能有多个不同的值)
val col = g.collect { // Map[String, Int]
case (_, single :: Nil) => single
}