假设我有以下数组,我想摆脱连续的重复:
arr = [1,1,4,3,5,1]
我想得到以下内容:
=> [1,1]
如果有一些比我的解决方案(或其变体)更简单和更有效率,那将是巨大的:
(arr + [nil]).each_cons(2).collect { |i| i[0] != i[1] ? i[0] : nil }.compact
要么
(arr + [nil]).each_cons(2).each_with_object([]) { |i,memo| memo << i[0] unless i[0] == i[1] }
编辑:
看来@ ArupRakshit的解决方案很简单.我仍然在寻找比我的解决方案更好的效率.
编辑:
当我们来的时候,我会对他们作出反应:
require 'fruity' arr = 10000.times.collect { [rand(5)] * (rand(4) + 2) }.flatten compare do abdo { (arr + [nil]).each_cons(2).collect { |i| i[0] != i[1] ? i[0] : nil }.compact } abdo2 { (arr + [nil]).each_cons(2).each_with_object([]) { |i,memo| memo << i[0] unless i[0] == i[1] } } arup { arr.chunk(&:to_i).map(&:first) } arupv2 { arr.join.squeeze.chars.map(&:to_i) } agis { i = 1 a = [arr.first] while i < arr.size a << arr[i] if arr[i] != arr[i-1] i += 1 end a } arupv3 { arr.each_with_object([]) { |el,a| a << el if a.last != el } } end
基准测试结果:
agis is faster than arupv3 by 39.99999999999999% ± 10.0% arupv3 is faster than abdo2 by 1.9x ± 0.1 abdo2 is faster than abdo by 10.000000000000009% ± 10.0% abdo is faster than arup by 30.000000000000004% ± 10.0% arup is faster than arupv2 by 30.000000000000004% ± 10.0%
如果我们使用:
arr = 10000.times.collect { rand(4) + 1 } # less likelihood of repetition
我们得到:
agis is faster than arupv3 by 19.999999999999996% ± 10.0% arupv3 is faster than abdo2 by 1.9x ± 0.1 abdo2 is similar to abdo abdo is faster than arupv2 by 2.1x ± 0.1 arupv2 is similar to arup
解决方法
使用
Enumerable#chunk
进行如下操作:
arr = [1,1] arr.chunk { |e| e }.map(&:first) # => [1,1] # if you have only **Fixnum**,something magic arr.chunk(&:to_i).map(&:first) # => [1,1]
UPDATE
arr.join.squeeze.chars.map(&:to_i) # => [1,1]
另一个选择
arr.each_with_object([]) { |el,a| a << el if a.last != el }