我正在使用Ruby 2.4。我试图在数组中拆分元素。我想要的是与分裂的结果形成等效阵列。我希望拆分的第一部分是第一个数组,而Teh Split的第二部分为第二个数组。所以我有
data_col = ["mm a", "nn b", "nn a"]
arr1, arr2 = data_col.map do |x|
if x
a, b, c = x.partition(/(^|[[:space:]]+)[ab]$/i)
[b.strip, a + c]
else
[nil, nil]
end
end.transpose
#=> [["a", "b", "a"], ["mm", "nn", "nn"]]
问题是,拆分正在起作用,但是阵列正在逆转。我希望["mm", "nn", "nn"]
成为数组中的第一个元素。我如何重写事物,以使阵列正确返回 - 也就是说,拆分的第一部分位于第一个数组中,而拆分的第二部分位于第二个数组中?
data_col = ["mm a", "nn b", "nn a"]
arr1, arr2 = data_col.map do |x|
a, b, c = x.partition(/(^|[[:space:]]+)[ab]$/i)
[a + c, b.strip] # <=================== switched b.strip and a+b
end.transpose
#=> [["mm", "nn", "nn"], ["a", "b", "a"]]
我删除了if x
条件,因为您的 map
ping中无法从 if x
获得 false
:)
我认为您甚至不需要使用Regex进行o/p的分区,您只需将映射与拆分和转介使用以获取相同的O/P与用正则分区相比,非常快。以下是5秒钟的简单基准,
require 'benchmark/ips'
data_col = ["mm a", "nn b", "nn a"]
Benchmark.ips do |x|
x.config(time: 5, warmup: 2)
x.report('REGEXP') do
arr1, arr2 = data_col.map do |xx|
a, b, c = xx.partition(/(^|[[:space:]]+)[ab]$/i)
[a + c, b.strip]
end.transpose
end
x.report('MAP SPLIT') do
arr1, arr2 = data_col.map do |xx|
xx.split(' ').map(&:strip)
end.transpose
end
x.compare!
end
及以下是IPS比较,
Warming up --------------------------------------
REGEXP 16.985k i/100ms
MAP SPLIT 26.771k i/100ms
Calculating -------------------------------------
REGEXP 190.220k (± 4.5%) i/s - 951.160k in 5.012963s
MAP SPLIT 303.243k (± 3.5%) i/s - 1.526M in 5.040226s
Comparison:
MAP SPLIT: 303243.1 i/s
REGEXP: 190219.6 i/s - 1.59x slower
您可以看到带有拆分的地图是执行 303243.1 I/S ,其中带有REGEX的分区正在执行 190219.6 I/S 因此,带有拆分的地图是 1.59x的速度比用正则分区的。