Уникальные элементы могут быть определены следующим образом:
arr = [1, 2, 3, 2, 1, 4, 1]
uniq = arr.each_with_object(Hash.new(0)) {|e,h| h[e] += 1}.select {|_,v| v == 1}.keys
#=> [3, 4]
Чтобы удалить уникальные элементы:
arr.reject { |e| uniq.include?(e) }
#=> [1, 2, 2, 1, 1]
Характер объектов в массиве (числа, массивы, хэши, экземпляры и т. Д.) Не имеет отношения к вопросу.
Для определения уникальных элементов используется форма Hash :: new , которая принимает аргумент (здесь ноль), то есть значение, возвращаемое h[k]
, если хеш h
не имеет ключа k
. Следовательно, выражение h[e] += 1
, которое Ruby расширяет до
h[e] = h[e] + 1
перед оценкой становится
h[e] = 0 + 1
, если h
не имеет ключа k
. Это иногда называют подсчитывающим хешем .