Как заменить это значение nil в стиле Ruby - PullRequest
1 голос
/ 07 октября 2019

У меня есть массив, подобный

 A=[[a,x,y,z],[nil,e,f,d],[nil,k,j,u],[nil,w,p,k],[b,x,y,z],[nil,e,f,d],[nil,k,j,u],[nil,w,p,k]]

Результат

 A=[[a,x,y,z],[a,e,f,d],[a,k,j,u],[a,w,p,k],[b,x,y,z],[b,e,f,d],[b,k,j,u],[b,w,p,k]]

Возможно, вы заметили, что первый символ первого массива заменяет предстоящее значение nil до первого символа первогомассив - это b, а затем nil-значения заменяются на b.

Этого я достиг, выполнив итерацию массива и записав условие if и сохранив где-то первый символ, а затем сравнив первый символ во время итерации. Но я все еще не нахожу рубиновый способ сделать это. Может ли кто-нибудь помочь мне здесь

Ответы [ 2 ]

3 голосов
/ 07 октября 2019
A = [['a',1,2],[nil,3,4],[nil,5,6],[nil,7,8],['b',9,10],[nil,11,12],[nil,13,14]]

A.each_cons(2){|first, last| last[0] ||= first[0] }

last[0] ||= first[0] означает что-то вроде «Дайте last [0] значение first [0], если оно уже не имеет значения (не nil или false)».

2 голосов
/ 07 октября 2019
arr = [['a',1,2],[nil,3,4],[nil,5,6],[nil,7,8],['b',9,10],[nil,11,12],[nil,13,14]]

last = nil
arr.map do |f,*rest|
  if f.nil?
    [last, *rest]
  else
    last = f
    [f, *rest]
  end
end
  #=> [["a", 1, 2], ["a", 3, 4], ["a", 5, 6], ["a", 7, 8],
  #    ["b", 9, 10], ["b", 11, 12], ["b", 13, 14]] 

Шаги следующие:

last = nil
enum = arr.map
  #=> #<Enumerator: [["a", 1, 2], [nil, 3, 4], [nil, 5, 6], [nil, 7, 8],
  #                  ["b", 9, 10], [nil, 11, 12], [nil, 13, 14]]:map> 
f,*rest = enum.next
  #=> ["a", 1, 2]
f #=> "a"
rest
  #=> [1, 2] 
f.nil?
  #=> false 
last = f
  #=> "a" 
[f, *rest]
  #=> ["a", 1, 2] 

f,*rest = enum.next
  #=> [nil, 3, 4] 
f.nil?
  #=> true 
[last, *rest]
  #=> ["a", 3, 4] 

f,*rest = enum.next
  #=> [nil, 5, 6] 
f.nil?
  #=> true 
[last, *rest]
  #=> ["a", 5, 6] 

f,*rest = enum.next
  #=> [nil, 7, 8] 
f.nil?
  #=> true 
[last, *rest]
  #=> ["a", 7, 8] 

и т. Д.

В качестве альтернативы,

arr.drop(1).each_with_object([arr.first]) { |a,ar|
  ar << [a.first || ar.last.first, *a.drop(1)] }
  #=> [["a", 1, 2], ["a", 3, 4], ["a", 5, 6], ["a", 7, 8],
  #    ["b", 9, 10], ["b", 11, 12], ["b", 13, 14]] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...