我有一些不同长度的数组,它们在代码中早先生成,由有序对的子数组组成。如果有多对,则输出为阵列数组。如果只有一对,则输出为单个数组。
变换输出的简单,一致的方法是什么,它总是处于一个递归级别,而不会写一些过于狭窄的东西来测试那个确切的事件?现在我有:
output_array = [7, 5]
output_array = output_array.flatten.each_slice(2).to_a
=> [[7, 5]]
output_array = [[7, 5], [6, 2]]
output_array = output_array.flatten.each_slice(2).to_a
=> [[7, 5], [6, 2]]
答案 0 :(得分:2)
不太可爱但更快的是检查内部元素是否为数组,如果不是将其插入空数组中。
oa1.first.kind_of?(Array) ? oa1 : [oa1]
Mudasobwa请原谅我使用你的优秀解决方案进行比较。
require 'benchmark'
n = 10_000
oa1 = [5,7]
oa2 = [[5,7],[6,8]]
c1 = c2 = c3 = 0
Benchmark.bm do |x|
x.report {
n.times do
c1 += oa1.flatten.each_slice(2).to_a.first.first \
+ oa2.flatten.each_slice(2).to_a.first.first
end
}
x.report {
n.times do
c2 += Hash[*oa1.flatten].to_a.first.first \
+ Hash[*oa2.flatten].to_a.first.first
end
}
x.report {
n.times do
c3 += (oa1.first.kind_of?(Array) ? oa1 : [oa1]).first.first \
+ (oa2.first.kind_of?(Array) ? oa2 : [oa2]).first.first \
end
}
end
puts "c1 = #{c1}, c2 = #{c2}, c3 = #{c3}"
给出
user system total real
0.063000 0.000000 0.063000 ( 0.071007)
0.062000 0.000000 0.062000 ( 0.056006)
0.016000 0.000000 0.016000 ( 0.008001)
c1 = 100000, c2 = 100000, c3 = 100000
答案 1 :(得分:1)
[编辑] 注意!此解决方案在重复密钥([1,3,1,4]
)上失败,归功于Shawn Balestracci
请使用以下@peter建议的解决方案
出于好奇,切换2总是强制考虑哈希式结构,不是吗?因此,您可以使用:
Hash[*output_array.flatten].to_a
这至少要快两倍:
require 'benchmark'
n = 10_000
oa1 = [5,7]
oa2 = [[5,7],[6,8]]
c1 = c2 = 0
Benchmark.bm do |x|
x.report {
n.times do
c1 += oa1.flatten.each_slice(2).to_a.first.first \
+ oa2.flatten.each_slice(2).to_a.first.first
end
}
x.report {
n.times do
c2 += Hash[*oa1.flatten].to_a.first.first \
+ Hash[*oa2.flatten].to_a.first.first
end
}
end
puts "c1 = #{c1}, c2 = #{c2}"
user system total real
0.100000 0.000000 0.100000 ( 0.117027)
0.060000 0.000000 0.060000 ( 0.064323)
c1 = 100000, c2 = 100000