加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从Ruby数组中删除顺序重复

发布时间:2020-12-16 20:03:17 所属栏目:百科 来源:网络整理
导读:假设我有以下数组,我想摆脱连续的重复: 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 +
假设我有以下数组,我想摆脱连续的重复:
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

根据@abdo’s评论,这里是另一个选择:

arr.join.squeeze.chars.map(&:to_i)
# => [1,1]

另一个选择

arr.each_with_object([]) { |el,a| a << el if a.last != el }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读