Ruby - список минус

У меня есть два списка

a = [1, 2, 3, 4, 1, 2]
b = a.uniq # b = [1, 2, 3, 4]

c = a - b

результат получает c = []

Я ожидаю результат c = [1, 2]

Как я могу получить это?

Ответ 1

Это ожидаемый результат в соответствии с Документация массива.

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

a.uniq.keep_if {|v| a.count(v) > 1}

Если используется Ruby 1.8, keep_if недоступен, поэтому вам нужно использовать что-то вроде:

a.uniq.delete_if {|v| a.count(v) == 1}

(Оба метода сохраняют a неповрежденными)

Ответ 2

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

a.delete_if { |x| a.count(x) <= 1 }.uniq

Если вы хотите выполнить вспомогательную операцию на двух массивах на основе позиции элементов, вы можете использовать следующий код:

i = 0
a.drop_while { |x| b[i+=1] == x }.uniq

Ответ 3

Из документации

Array Difference - возвращает новый массив, который является копией исходного массива, удаляя любые элементы, которые также отображаются в other_ary. (Если вам нужно поведение типа установки, см. Класс библиотеки Set.)

Ответ 5

Похоже, вы пытаетесь найти элементы с дубликатами. Вот несколько способов, выберите тот, который вам нравится:

a.select { |x| a.count(x) > 1 }.uniq
a.sort.each_cons(2).map { |x,y| x if x == y }.compact
a.group_by{|x|x}.values.select{|k|k.size>1}.map(&:first)