Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何筛选数组中的元素?_Ruby_Arrays - Fatal编程技术网

Ruby 如何筛选数组中的元素?

Ruby 如何筛选数组中的元素?,ruby,arrays,Ruby,Arrays,示例阵列: x = [1,2,3,4,2,2,2] 过滤器: y = [2,4,7,9] 期望输出: result = [2,4,2,2,2] 我试过: result = (x & y) 但这给了我[4,2] 如何获取:result=[2,4,2,2,2]?首先,在Ruby中不要将变量大写。大写表示常量,如类名 result = x.select {|i| y.include? i} 注意,select也称为find_all,是ruby中的正过滤器;负过滤器是拒绝。在大括号之间

示例阵列:

x = [1,2,3,4,2,2,2]
过滤器:

y = [2,4,7,9]
期望输出:

result = [2,4,2,2,2]
我试过:

result = (x & y)
但这给了我
[4,2]


如何获取:
result=[2,4,2,2,2]

首先,在Ruby中不要将变量大写。大写表示常量,如类名

result = x.select {|i| y.include? i}

注意,
select
也称为
find_all
,是ruby中的正过滤器;负过滤器是
拒绝
。在大括号之间,你可以放置任何你想要的代码;它将为
x
的每个项运行一次(该项作为参数传入并成为
i
),整个调用的结果将包括块返回真值的所有元素

1-2行比@Mark的答案长,但效率更高(如果两个数组都较大):


写作的问题

…这是O(x*y)每个数组中的元素数。每个元素中有100个元素,在最坏的情况下,您正在执行10000个操作;我的答案只做100次运算。

那么:

x - (x - y)
#=> [2, 4, 2, 2, 2]

过早优化是万恶之源!但是是的,将
y
转换成一个集合可以提高性能。此外,我认为示例中结果的排序是巧合的;它的元素顺序与它们在输入列表中的顺序相同。此外:我认为理解算法复杂性并选择一个没有潜在灾难性的元素与过早优化不同。这只是很好的编码。在我为你工作的一家大型软件公司,你会惊讶于我们在代码中发现了多少O(n^3)算法,这些算法是多年前实习生放在代码中的。当产品在稍大的数据集上使用时,这些代码最终导致了完全不可接受的性能问题。好吧,我看到过更多的生产问题是由过度复杂(其中一些是您真正引入的)而不是糟糕的算法选择造成的。在这种情况下,即使对于小列表,使用集合也可能没有缺点,但是在一些类似的情况下,使更高效的算法成为可能所需的设置开销可以轻易地超过收益。这就是为什么了解您的数据域和事务量很重要,这就是“过早”部分的原因。:)那么
x
中的前两个呢?他把它修好了,看起来像个打字错误。还有,这场势均力敌的投票是怎么回事?
x.select{ |i| y.include?(i) }
x - (x - y)
#=> [2, 4, 2, 2, 2]