Как получить все элементы из этого массива с помощью ruby? - PullRequest
0 голосов
/ 23 октября 2018

Хотите получить все уникальные идентификаторы из этого типа массива:

[[], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2]]

Ответы [ 3 ]

0 голосов
/ 23 октября 2018
[[], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2]].
  reduce([]) { |acc, e| acc | e }
  # or (credit goes to @Stefan)
  # reduce([], :|)

#⇒ [1, 2, 3, 4, 5, 6, 7, 8]
0 голосов
/ 23 октября 2018

Для полноты картины воспользуйтесь Micro-Benchmark, который показывает еще одно решение: используйте версии на месте uniq!, которые будут немного быстрее.

Если можно изменить исходный массив, вы также можете использовать

array.flatten! array.uniq! но имейте в виду, что это изменяет array, и это может быть нежелательным, особенно если это параметр метода.

Вот микропроцессор:

require "benchmark/ips"
# ARRAY = [[], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2]].freeze
ARRAY = [[], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2], [], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2], [], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2], [], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2],[], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2]].freeze

Benchmark.ips do |x|
    x.compare!

    x.report("flatten.uniq") { ARRAY.flatten.uniq }
    x.report("flatten.uniq!") { ARRAY.flatten.uniq! }
    x.report("reduce") { ARRAY.reduce([]) { |acc, e| acc | e } }
end

И вот результаты:

Comparison:
       flatten.uniq!:   107888.3 i/s
        flatten.uniq:   105813.6 i/s - same-ish: difference falls within error
              reduce:    49892.6 i/s - 2.16x  slower

Обратите внимание, что вариант reduce может быть на самом деле быстрее, если элементов меньше.Но он будет работать только с одним уровнем вложенности, тогда как другие версии будут работать для всех уровней.Так что [[[1]]] не будет работать с вариантом reduce.

0 голосов
/ 23 октября 2018

Учитывая a ваш массив

a.flatten.uniq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...