Вот три способа сделать это (ответ Раджагопалана - другой).
arr = [1, 1, 2, 3, 4, 4, 5]
Использовать счетный хеш
arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }.select { |_,v| v == 1 }.keys
# => [2, 3, 5]
Используйте Array # count
arr.uniq.select { |n| arr.count(n) == 1 }
#=> [2, 3, 5]
Это может показаться относительно неэффективным, учитывая, что arr
необходимо пройти для каждого элемента arr.uniq
.Однако, если arr.uniq
не слишком велико, оно может быть быстрее, чем использование счетного хэша или (как это сделал Раджагопалан) Enumerable # group_by .
Использовать Массив # разница
Array#difference
- это метод, который я предложил добавить в ядро Ruby.
class Array
def difference(other)
h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
reject { |e| h[e] > 0 && h[e] -= 1 }
end
end
Если бы мы использовали этот метод, мы могли бынапишите следующее.
arr - arr.difference(arr.uniq)
#=> [2, 3, 5]