Как использовать метод сбора и включения для многомерного массива - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть:

array1 = [[1,2,3,4,5],[7,8,9,10],[11,12,13,14]]
@student_ids = [1,2,3]

Я хочу заменить элементы в array1, включенные в @student_ids, на 'X'.Я хочу видеть:

[['X','X','X',4,5],[7,8,9,10],[11,12,13,14]]

У меня есть код, который предназначен для этого:

array1.collect! do |i| 
  if i.include?(@student_ids) #
    i[i.index(@student_ids)] = 'X'; i # I want to replace all with X
  else
    i
  end
end

Если @student_ids равен 1, то это работает, но если @student_ids имеет более одного элемента, например 1,2,3, это вызывает ошибки.Любая помощь?

Ответы [ 4 ]

0 голосов
/ 27 декабря 2018

Использовать хэш или набор быстрее, чем повторно проверять [1,2,3].include?(n).

arr = [[1,2,3,4,5],[7,8,9,10],[11,12,13,14]]
ids = [1,2,3]

Использовать хэш

h = ids.product(["X"]).to_h
  #=> {1=>"X", 2=>"X", 3=>"X"}
arr.map { |a| a.map { |n| h.fetch(n, n) } }
  #=> [["X", "X", "X", 4, 5], [7, 8, 9, 10], [11, 12, 13, 14]]

См. Hash # fetch .

Использовать набор

require 'set'

ids = ids.to_set
  #=> #<Set: {1, 2, 3}>
arr.map { |a| a.map { |n| ids.include?(n) ? "X" : n } }
  #=> [["X", "X", "X", 4, 5], [7, 8, 9, 10], [11, 12, 13, 14]]

Заменить оба map с map!, если массив должен быть изменен вместо (видоизменено).

0 голосов
/ 27 декабря 2018

Попробуйте следующее, (взяв @student_ids = [1, 2, 3])

array1.inject([]) { |m,a| m << a.map { |x| @student_ids.include?(x) ? 'X' : x } }

# => [["X", "X", "X", 4, 5], [7, 8, 9, 10], [11, 12, 13, 14]] 
0 голосов
/ 27 декабря 2018

Вы можете сделать следующее:

def remove_student_ids(arr)
  arr.each_with_index do |value, index| 
   arr[index] = 'X' if @student_ids.include?(value) }
  end
end

array1.map{ |sub_arr| remove_student_ids(sub_arr)}
0 голосов
/ 27 декабря 2018

Вы можете использовать each_with_index и заменить нужный элемент:

array1 = [[1,2,3,4,5],[7,8,9,10],[11,12,13,14]]
@student_ids = [1,2,3]

array1.each_with_index do |sub_array, index|
  sub_array.each_with_index do |item, index2|
    array1[index][index2] = 'X' if @student_ids.include?(item)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...