Почему мое перечисление останавливается после первого отклонения в Ruby? - PullRequest
0 голосов
/ 30 апреля 2019

отчаянно нуждается в помощи.Я пытаюсь удалить массивы и массивы массивов, и я столкнулся с дорожным блоком.По сути, если первое значение в дочернем массиве не существует ни в одной из позиций любых других дочерних массивов, то его следует удалить.(предположим, что массив будет отсортирован - потому что он будет)

arr = [[0, 1], [2, 3], [4, 5]]
arr.each_with_index do |inside_array, index|
    if !index.zero?
        # arr.delete(arr[index]) if arr.select {|x| x.include?(inside_array[0])}.count < 2
        # refactored
        arr.reject! {|x| x.include?(inside_array[0])}
    end
end
=> [[0, 1], [4, 5]]
# Why does it stop itterating/enumerating after the first deletion?
# Goal output is [[0, 1]] for this example

Аналогично, массив, такой как [[0, 1], [2, 3], [1, 5]], должен давать [[0, 1], [1, 5]] -или - [[0, 1], [2, 3], [0, 3]], должен давать [[0, 1], [0, 3]]

1 Ответ

0 голосов
/ 30 апреля 2019

Вы пытались изменить исходный массив.Это ваша проблема.

В этом случае вам нужно продублировать его следующим образом:

arr = [[0, 1], [2, 3], [4, 5]]
arr.dup.each_with_index do |inside_array, index|
  if !index.zero?
    arr.reject! {|x| x.include?(inside_array[0])}
  end
end

arr #=> [[0, 1]]

Так что просто используйте dup

Что касается второго вопроса (реализацияудаление подмассива), я предлагаю этот рефакторинг:

def remove_subarray(arr)
  arr.reject { |inside_array| (inside_array & arr.first).empty? }
end

remove_subarray([[0, 1], [2, 3], [4, 5]]) #=> [[0, 1]]
remove_subarray([[0, 1], [2, 3], [1, 5]]) #=> [[0, 1], [1, 5]]
remove_subarray([[0, 1], [2, 3], [0, 3]]) #=> [[0, 1], [0, 3]]
...