我在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]
现在它看起来像差异而不是减去。
我不知道从哪里开始。现在我迷路了。任何帮助表示赞赏。
答案 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_delete
和cnt + d > max_nbr_to_delete
,e.to_s[cnt+d-max_nbr_to_delete..-1].to_i
被退回(即cnt+d-max_nbr_to_delete
的{{1}}个数字被移除)。