我有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)]
如何做到這一點任何想法?
謝謝!
我有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)]
如何做到這一點任何想法?
謝謝!
如果你在每個列表中尋找獨特的元素,那麼你可以使用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))
查找元素非唯一通過展開所有值和過濾元素的大小大於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)
爲什麼'a'沒有List(1)?而不是列表(3)。 '3'在'b'中很常見 – prayagupd