Извлекать не уникальные значения из массива - PullRequest
0 голосов
/ 31 октября 2018

Я могу удалить уникальные значения из массива:

array_with_doubles = [[1, 2], [2, 3], [1, 2]]

с использованием uniq:

array_with_doubles.uniq
# => [[1, 2], [2, 3]]

Я хочу найти, какие значения были удалены.

Ответы [ 6 ]

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

Другой вариант, один вкладыш:

array_with_doubles = [[1, 2], [2, 3], [1, 2], [1, 2], [3, 5], [3, 5]]

array_with_doubles.uniq.each_with_object(array_with_doubles) { |e, a| a.delete_at(a.rindex(e)) }
# => [[1, 2], [1, 2], [3, 5]]
0 голосов
/ 31 октября 2018

Я решил выше, как показано ниже,

arr.inject([[],[]]) { |m, a| m[0].include?(a) ? m[1] << a : m[0] << a; m }[1]
0 голосов
/ 31 октября 2018

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

array_with_doubles = [[1, 2], [2, 3], [1, 2], [1, 2]]
require 'set'
array_with_doubles.each_with_object(Set.new).inject([]) { |a, (e, seen)|
  a << e if seen === e
  seen << e
  a
}
# => [[1, 2], [1, 2]]

В отличие от большинства других ответов, если элемент будет удален дважды с помощью uniq, обе его копии показываются этим кодом. uniq сохраняет первый равный элемент, тогда как этот код отклоняет первый равный элемент.

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

Вы можете попробовать это:

 array_with_doubles.uniq.select { |x| array_with_doubles.count(x) > 1 }
0 голосов
/ 31 октября 2018

Уникальные элементы могут быть определены следующим образом:

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. Это иногда называют подсчитывающим хешем .

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

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

array_with_doubles = [[1,2], [2,3], [1,2]]

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

array_with_doubles.group_by{|x|x}.map_values(&:size).select {|k,v| v>1}.keys
# => [[1,2]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...