我如何以分裂中发生的顺序返回分裂结果



我正在使用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的速度比用正则分区的。

相关内容

  • 没有找到相关文章

最新更新