a1 = [1, 2, 2, 1, 4]
a2 = [1, 2, 3]
预期产出:
[1, 2, 2, 1]
a1中的四个元素是a2。
a1 & a2
只给我uniq元素[1, 2]
,但我需要非uniq元素。
有没有比做以下更好的方法,我认为效率不高:
a1.select{|ele| a2.include?(ele)}
答案 0 :(得分:4)
a1 - (a1 - a2)
# => [1, 2, 2, 1]
答案 1 :(得分:1)
我会加我的¢2。如果您可能在大型阵列上进行几次操作,@ sawa的方法绝对是您的选择:
require 'benchmark'
n = 1_000
a1 = 1_000.times.map { rand(1..100) }
a2 = 1_000.times.map { rand(5..95) }
Benchmark.bm do |x|
x.report {
n.times do
a1 - (a1 - a2)
end
}
x.report {
n.times do
a1.keep_if { |xx| a2.include? xx }
end
}
end
结果:
# user system total real
# 0.340000 0.000000 0.340000 ( 0.424604)
# 5.590000 0.010000 5.600000 ( 6.438095)
但如果小阵列上有很多减法:
- n = 1_000
- a1 = 1_000.times.map { rand(1..100) }
- a2 = 1_000.times.map { rand(5..95) }
+ n = 100_000
+ a1 = 10.times.map { rand(1..100) }
+ a2 = 10.times.map { rand(5..95) }
相反看起来更合适:
# user system total real
# 0.550000 0.010000 0.560000 ( 0.551997)
# 0.150000 0.000000 0.150000 ( 0.151695)
答案 2 :(得分:0)
这是一个选项
a1.keep_if { |x| a2.include? x }