我在scala中遇到以下问题。我必须在al列表中找到第一个元素,该元素满足OR中具有两个条件的谓词函数。问题是我想获取元素,但也知道两个条件中的哪一个已得到满足。这是一个简单的示例:
val l1 = List("A", "B", "AA", "BB")
val l2 = List("AA", "BB", "A", "B")
def c1(s: String) = s.startsWith("B")
def c2(s: String) = s.length == 2
println(l1.find(s => c1(s) || c2(s)))
println(l2.find(s => c1(s) || c2(s)))
结果是:
Some(B)
Some(AA)
对于l1情况,我想有一些返回值(例如,一个String),表示满足c1(对于l2情况,为c2)。
一个可能的解决方案是在测试之前定义一个var并将其设置在c1和c2函数中,但是我想找到一个更“函数式”的解决方案,也许返回一个类似Tuple的东西:(找到元素,条件得到满足)。
先谢谢您的帮助
最佳答案
我会这样做:
Scala 2.8:
def find2p[T](l: List[T], p1: T => Boolean, p2: T => Boolean) =
l.view.map(el => (el, p1(el), p2(el))).find(t => t._2 || t._3)
Scala 2.7:
def find2p[T](l: List[T], p1: T => Boolean, p2: T => Boolean) =
l.projection.map(el => (el, p1(el), p2(el))).find(t => t._2 || t._3)
view
/projection
确保映射将按需完成,而不是应用于整个列表。关于list - 在scala列表中查找元素,并且还知道满足哪个谓词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2175873/