【发布时间】:2012-11-12 17:30:29
【问题描述】:
我有一个 Seq 和函数 Int => Int。我需要实现的是从原始 Seq 中只取那些等于结果序列最大值的元素(那个,我将在应用给定函数后得到):
def mapper:Int=>Int= x=>x*x
val s= Seq( -2,-2,2,2 )
val themax= s.map(mapper).max
s.filter( mapper(_)==themax)
但这似乎很浪费,因为它必须映射两次(一次用于过滤器,另一次用于最大值)。 有一个更好的方法吗? (希望不使用循环)
编辑
该代码已被编辑;原来这是过滤器行:s.filter( mapper(_)==s.map(mapper).max)。正如om-nom-nom 所指出的,这会评估 `s.map(mapper).max 每次(过滤器)迭代,导致二次复杂度。
【问题讨论】:
-
目前尚不清楚您在上面究竟想做什么。
-
有一件事情比双遍历更浪费:你在 s.map(mapper) 上调用 max 而 max 是 O(n)。所以你最终会得到二次复杂度。
-
@om-nom-nom 是的,我想知道这一点,所以我不久前进行了编辑。我会把最大值放在一个 val 中
-
@Jatin 这是高度简化的代码,因为我正在处理原始的复杂结构;我不确定如何进一步简化它。如果它使这一点更清楚,在原始这不是 Int 的 Seq,而是对象的 Seq。我想要做的就是获取最大元素(在应用该函数之后)。
-
@scala_newbie 现在很清楚:)。我问的是前面的代码,你在过滤器中有最大值。