我有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)]
有关如何做到这一点的任何想法?
谢谢!
答案 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)