在scala中查找地图值中的唯一元素

时间:2017-08-25 22:35:53

标签: scala

我有Map [String,Seq [String]]。

我想在地图中的所有值中找到唯一元素。我想在Scala中这样做。

说,我有

Map['a' -> Seq(1,2,3),
'b' -> Seq(2,3),
'c' -> Seq(4)
]

我希望所需的结果是

Map['a' -> Seq(3), 'c' -> Seq(4)]

有关如何做到这一点的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您要在每个列表中查找唯一元素,则可以使用currentList.diff(rest_of_the_list)

<强>鉴于

scala> val input = Map('a' -> Seq(1,2,3), 'b' -> Seq(2,3), 'c' -> Seq(4))
input: scala.collection.immutable.Map[Char,Seq[Int]] = Map(a -> List(1, 2, 3), b -> List(2, 3), c -> List(4))

查找每个键的其余元素

scala> val unions = input.map(elem => elem._1 -> input.filter(!_._1.equals(elem._1)).flatMap(_._2).toSet)
unions: scala.collection.immutable.Map[Char,scala.collection.immutable.Set[Int]] = Map(a -> Set(2, 3, 4), b -> Set(1, 2, 3, 4), c -> Set(1, 2, 3))

然后,迭代输入地图并在每个列表中找到唯一元素

scala> input.map(x => x._1 -> x._2.diff(unions(x._1).toList))
res18: scala.collection.immutable.Map[Char,Seq[Int]] = Map(a -> List(1), b -> List(), c -> List(4))

如果您不想要空键(上例中为b

scala> input.map(x => x._1 -> x._2.diff(unions(x._1).toList)).filter(_._2.nonEmpty)
res21: scala.collection.immutable.Map[Char,Seq[Int]] = Map(a -> List(1), c -> List(4))

答案 1 :(得分:0)

通过展平所有值并过滤大小超过1的元素来查找非唯一的元素。然后,删除每个键中的所有非唯一元素。

val input = Map('a' -> Seq(1,2,3),
    'b' -> Seq(2,3),
    'c' -> Seq(4))
val nonUnique = input.values.flatten
  .groupBy(identity)
  .filter(_._2.size > 1)
  .keys.toSeq
input.mapValues(x => x.diff(nonUnique)).filter(_._2.size == 1)