我有一个清单
["AZ", "BZ", "C", "AY", "BY"]
我想将“AZ”和“BZ”替换为“Z”,只要它们都出现。我想将“AY”和“BY”替换为“Y”,只有它们都出现。
所以,
["AZ", "BZ", "C", "AY", "BY"]
变为["Z", "C", "Y"]
["AZ", "C", "AY", "BY"]
变为["AZ", "C", "Y"]
["BZ", "C", "AY"]
变为["BZ", "C", "AY"]
这是一个很好的功能性方法。我只能想到首先检查Z和Y的两个术语是否存在,然后如果它们存在则进行映射然后做一个唯一的。
答案 0 :(得分:4)
val v = Vector("AZ", "BZ", "C", "AY", "BY")
val s = Set("A", "B")
val output =
v.groupBy(_.drop(1))
.flatMap { case (last, group) =>
val groupSet = group.map(_.take(1)).toSet
if(s.forall(groupSet)) Vector(last) else group
}
println(output)
// List(Y, Z, C)
答案 1 :(得分:0)
你会考虑这个功能吗?
val s = Set("AZ", "BZ", "C", "AY", "BY")
val sz = Set("AZ", "BZ")
val sy = Set("AY", "BY")
val output = (s--sz--sy) ++
(if ((s&sz)==sz) sz.map(_.drop(1)) else (s&sz)) ++
(if ((s&sy)==sy) sy.map(_.drop(1)) else (s&sy))