仅在两个术语出现时搜索和替换

时间:2013-10-09 15:39:06

标签: scala coffeescript underscore.js

我有一个清单

["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的两个术语是否存在,然后如果它们存在则进行映射然后做一个唯一的。

2 个答案:

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