Как обнаружить повторяющиеся значения в массиве в Ruby? - PullRequest
7 голосов
/ 07 марта 2012

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

a = [cat, dog, cat, mouse, rat, dog, cat]

Как мне пройти через это и сделать что-то с дубликатами - например, скажи удалить их?

Другими словами, если я сделал a.each do |i|, как мне оценить [0], против [1], a [2], a [3] ... и затем, когда я найду тот, который хочу скажем, [2] в этом случае имеет первый дубликат, я затем помещаю его в стек или удаляю или что-то в этом роде.

Я знаю, как оценивать ключи по сравнению со значениями ... но как мне сравнивать значения друг с другом в одном и том же массиве?

Спасибо.

Ответы [ 10 ]

11 голосов
/ 07 марта 2012

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

h = Hash.new(0)
['a','b','b','c'].each{ |e| h[e] += 1 }

Должно привести

 {"a"=>1, "b"=>2, "c"=>1}
6 голосов
/ 07 марта 2012

Это работает эффективно и довольно просто:

require 'set'

visited = Set.new
array.each do |element|
  if visited.include?(element)
    # duplicated item
  else
    # first appearance
    visited << element
  end
end
3 голосов
/ 07 марта 2012

Попробуйте:

class Array
    def find_dups
        uniq.map {|v| (self - [v]).size < (self.size - 1) ? v : nil}.compact
    end
end

a = ['cat', 'dog', 'cat', 'mouse', 'rat', 'dog', 'cat']

print a - a.find_dups # Removes duplicates

find_dups вернет элементы с дубликатами

2 голосов
/ 07 марта 2012

Попробуйте это:

array.inject({}){|h, e| h[e] = h[e].to_i + 1; h}
1 голос
/ 07 марта 2012

Использование a.uniq! для удаления дубликатов.

также проверьте ruby-doc.org , где вы можете найти больше информации о методах класса ruby.

1 голос
/ 07 марта 2012

Простым решением является запуск двойного цикла:

a.each_with_index do |a1, idx1|
  a.each_with_index do |a2, idx2|
    next if idx1 >= idx2 # Don't compare element to itself 
                         # and don't repeat comparisons already made

    # do something with a pair of elements (a1, a2)
  end
end

Если вы просто хотите устранить дубликаты, есть метод: Array#uniq.

0 голосов
/ 11 сентября 2017

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

unique_array = original_array.uniq

получите уникальную версию вашего массива

if original_array == unique_array then return true else return false

сравните ее с вашим исходным массивом.

Простой!

0 голосов
/ 01 сентября 2017

Если массив является сортируемым, то, как показано ниже, будут возвращаться только дубликаты.

array.sort.each_cons(2).select {|p| p[0] == p[1] }.map &:first

Сортирует массив, затем сопоставляет его с последовательными парами элементов, выбирает одинаковые пары, сопоставляет с элементами.

0 голосов
/ 04 февраля 2015

Если вы просто хотите избавиться от дубликатов, проще всего взять массив и выполнить массив и массив. Используйте оператор &.

Если вы хотите узнать, что это за повторы, просто сравните массив с массивом и массивом.

0 голосов
/ 07 августа 2014

Это напечатает все дубликаты в массиве:

array.inject(Hash.new(0)) { |hash,val| 
  hash[val] += 1; 
  hash 
}.each_pair { |val,count| 
  puts "#{val} -> #{count}" if count > 1 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...