2017-08-25 44 views
-1

我有Map [String,Seq [String]]。在scala中查找地圖值中的獨特元素

我想在地圖中的所有值中找到唯一的元素。我想在Scala中做到這一點。

說,我

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

我想理想的結果是

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

如何做到這一點任何想法?

謝謝!

+4

爲什麼'a'沒有List(1)?而不是列表(3)。 '3'在'b'中很常見 – prayagupd

回答

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)) 

然後,迭代輸入映射和(在上面的例子中b)在每個每個列表

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)) 

找到獨特的元素,如果你不想空鍵

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)) 
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)