Получить разницу между 2D массивами - PullRequest
0 голосов
/ 23 сентября 2019

У меня проблемы с двумерными массивами, чтобы получить значения, которые существуют в одном массиве и не существуют в другом.

У нас есть 2 массива

[["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]

Ивторой

[["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]

Таким образом, вывод должен быть

[["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]

Атм. Я делаю это таким образом, но я изо всех сил, потому что он возвращает только 1 запись

detect = []
records = first_array.collect {|a| a[0]} - second_array.collect {|a| a[0]}
    records.each do |r|
      detect = first_array.detect { |k, v| k == r }
    end
return detect

Ответы [ 6 ]

3 голосов
/ 23 сентября 2019

Вы можете использовать оператор -

a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]

# You can find the difference between the arrays with - operator
a - b 
#~> [["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
b - a 
#~> [["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]
1 голос
/ 23 сентября 2019

Желаемое решение:

    irb> a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
    irb> b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]
    irb> b-a
         => [["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]] 
0 голосов
/ 23 сентября 2019

Чтобы получить разницу между подмассивами, вам нужно будет выполнить итерацию.Я считаю, что это предлагает лучшее решение для краткости и производительности, поскольку другие имеют дело с плоскими массивами, оставляют ненужные элементы или повторяются несколько раз.

Вот как:

Если вы используете Ruby 2.7:

a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]

a.map.with_index { |arr, i| b[i].difference(arr) }
# => [[], ["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]

или до 2.7:

a.map.with_index { |arr, i| b[i] - arr }
# => [[], ["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]

Если вам нужно избегатьПри появлении пустых массивов, где результаты совпадают, вы можете немного подправить:

# Ruby 2.7
a.filter_map.with_index do |arr, i|
  diff = b[i].difference(arr)
  diff if diff.any?
end
# => [["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]

# < Ruby 2.7
a.each_with_object([]).with_index do |(arr, results), i|
  diff = b[i] - arr
  results << diff if diff.any?
end
# => [["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]

Надеюсь, что это поможет - дайте мне знать, как вы поживаете, или если у вас есть какие-либо вопросы.

0 голосов
/ 23 сентября 2019

Простейший пример

a1 = [[1,2,3],[1,2]] 
a2 = [[1,2,3],[1,3]]
a1-a2
[[1, 2]] 
a2-a1
[[1, 3]] 
0 голосов
/ 23 сентября 2019
a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]

, если вы используете a[0] - b[0], это даст массив, который имеет a значений, но не b .если вы используете b[0] - a[0], это даст массив, который имеет b значений, но не a .чтобы получить уникальные значения из обоих массивов, которые вы используете, нужно сделать ((a[0] - b[0]) - (a[0] - b[0])).uniq

a.each_with_index.map{|arr, index| ((arr - b[index]) + (b[index] - arr)).uniq }.reject!(&:empty?)

(предположим, что оба массива имеют одинаковый размер)

0 голосов
/ 23 сентября 2019

чтобы получить значения, которые существуют в одном массиве, а не существуют в другом

Чтобы получить этот результат, вам не нужно писать собственное решение, все вынужно:

(a1 - a2) + (a2 - a1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...