如何使用scala在列表中找到具有不同值的元组?

时间:2016-02-02 13:12:27

标签: scala

我有以下列表:

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

但这不是我要找的。

任何人都可以给出答案/提示我获得预期的输出。

2 个答案:

答案 0 :(得分:1)

在我看来,你想要同时匹配左手和右手的价值,同时还要保留你正在看的收藏类型,列表。我会使用collect

val out = myList.collect{
  case item @ ("name3", 40) => item
}

结合了PartialFunctionfiltermap类似的品质。在这种情况下,它会在映射匹配的值时过滤掉未定义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
}