Ruby Array - 删除前10位数字

时间:2014-07-17 16:35:43

标签: ruby arrays regex digits

我在Ruby中有一个数组,我想删除数组中的前10位数。

array = [1, "a", 3, "b", 2, "c", 4, "d", 5, "a", 1, "z", 7, "e", 21, "q", 30, "a", 4, "t", 7, "m", 5, 1, 2, "q", "s", "l", 13, 46, 31]

理想情况下会返回

['a', 'b', 'c', 'd', 'a', 'z', 'e', 'q', 0, 'a', 4, t, 7, m, 5 , 1, 2, q, s, 1, 13, 46, 31]

删除前10位数字(1,3,2,4,5,1,7,2,1,3)。

请注意,21(2和1)和30(3和0)都有2位

这是我尝试过的事情

digits = array.join().scan(/\d/).first(10).map{|s|s.to_i}
=> [1,3,2,4,5,1,7,2,1,3]
elements = array - digits

这就是我得到的

["a", "b", "c", "d", "a", "z", "e", 21, "q", 30, "a", "t", "m", "q", "s", "l", 13, 46, 31]

现在它看起来像差异而不是减去。

我不知道从哪里开始。现在我迷路了。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

删除10个号码:

10.times.each {array.delete_at(array.index(array.select{|i| i.is_a?(Integer)}.first))}
array

要删除10位数字:

array = [1, "a", 3, "b", 2, "c", 4, "d", 5, "a", 1, "z", 7, "e", 21, "q", 30, "a", 4, "t", 7, "m", 5, 1, 2, "q", "s", "l", 13, 46, 31]
i = 10
while (i > 0) do
    x = array.select{|item| item.is_a?(Integer)}.first
    if x.to_s.length > i
      y = array.index(x)
      array[y] = x.to_s[0, (i-1)].to_i
    else
      array.delete_at(array.index(x))
    end
    i -= x.to_s.length
end
array

答案 1 :(得分:3)

不幸的是不是单行:

count = 10
array.each_with_object([]) { |e, a|
  if e.is_a?(Integer) && count > 0
    str = e.to_s                     # convert integer to string
    del = str.slice!(0, count)       # delete up to 'count' characters
    count -= del.length              # subtract number of actually deleted characters
    a << str.to_i unless str.empty?  # append remaining characters as integer if any
  else
    a << e
  end
}
#=> ["a", "b", "c", "d", "a", "z", "e", "q", 0, "a", 4, "t", 7, "m", 5, 1, 2, "q", "s", "l", 13, 46, 31]

答案 2 :(得分:1)

我倾向于这样做。

<强>代码

def doit(array, max_nbr_to_delete)
  cnt = 0
  array.map do |e|
    if (e.is_a? Integer) && cnt < max_nbr_to_delete
      cnt += e.to_s.size
      if cnt <= max_nbr_to_delete
        nil
      else
        e.to_s[cnt-max_nbr_to_delete..-1].to_i
      end
    else
      e
    end
  end.compact
end

<强>实施例

array = [ 1, "a", 3, "b", 2, "c", 4, "d", 5, "a", 1, "z", 7, "e", 21, "q",
         30, "a", 4, "t", 7, "m", 5, 1, 2, "q", "s", "l", 13, 46, 31]

doit(array, 10)
  #=> ["a", "b", "c", "d", "a", "z", "e", "q", 0, "a", 4,
  #    "t", 7, "m", 5, 1, 2, "q", "s", "l", 13, 46, 31]
doit(array, 100)
  #=> ["a", "b", "c", "d", "a", "z", "e", "q", "a", "t", "m", "q", "s", "l"]    

<强>解释

不是整数的数组的每个元素e都映射到e

对于每个具有n位数的非负整数d,假设cnt是已从字符串中删除map的位数。有三种可能性:

  • 如果cnt >= max_nbr_to_delete,则不会删除更多数字,因此会返回e(本身)
  • 如果cnt + d <= max_nbr_to_delete要删除d的所有e位数,请将e映射到nil,然后删除nil } elements
  • 如果cnt < max_nbr_to_deletecnt + d > max_nbr_to_deletee.to_s[cnt+d-max_nbr_to_delete..-1].to_i被退回(即cnt+d-max_nbr_to_delete的{​​{1}}个数字被移除)。