我有一个包含一些字符串值的Ruby数组。我需要:
查找与某个谓词匹配的所有元素通过transformation
运行匹配的元素
现在我的解决方案是这样的:
def example
matchingLines = @lines.select{ |line| ... }
results = matchingLines.map{ |line| ... }
return results.uniq.sort
end
是否有Array或Enumerable方法将select和map组合到单个逻辑语句中?
发布于 2010-07-30 20:57:41
我通常将map
和compact
与我的选择标准一起使用,作为后缀if
。compact
摆脱了nils。
jruby-1.5.0 > [1,1,1,2,3,4].map{|n| n*3 if n==1}
=> [3, 3, 3, nil, nil, nil]
jruby-1.5.0 > [1,1,1,2,3,4].map{|n| n*3 if n==1}.compact
=> [3, 3, 3]
发布于 2019-06-12 22:59:39
Ruby 2.7+
现在有了!
Ruby2.7正是为了这个目的引入了filter_map
。它是惯用的,性能很好,我希望它很快就会成为常态。
例如:
numbers = [1, 2, 5, 8, 10, 13]
enum.filter_map { |i| i * 2 if i.even? }
# => [4, 16, 20]
希望这对某些人有用!
发布于 2013-07-17 22:59:05
为此,您可以使用reduce
,它只需要一次传递:
[1,1,1,2,3,4].reduce([]) { |a, n| a.push(n*3) if n==1; a }
=> [3, 3, 3]
换句话说,将状态初始化为您想要的状态(在我们的例子中,是一个要填充的空列表:[]
),然后始终确保返回这个值,并对原始列表中的每个元素进行修改(在我们的例子中,修改后的元素被推入列表)。
这是最有效的,因为它只通过一次遍历列表(map
+ select
或compact
需要两次遍历)。
在您的案例中:
def example
results = @lines.reduce([]) do |lines, line|
lines.push( ...(line) ) if ...
lines
end
return results.uniq.sort
end
https://stackoverflow.com/questions/3371518
复制相似问题