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.) Ответ 4 Вы ищете все дубликаты или наоборот uniq? Возможно, эта ссылка поможет: Определить дубликаты в массиве Ответ 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)
Ответ 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.)
Ответ 4 Вы ищете все дубликаты или наоборот uniq? Возможно, эта ссылка поможет: Определить дубликаты в массиве
Ответ 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)