Удалить повторяющиеся элементы из массива в Ruby

231

У меня есть массив Ruby, который содержит повторяющиеся элементы.

array = [1,2,2,1,4,4,5,6,7,8,5,6]

Как удалить все повторяющиеся элементы из этого массива, сохранив все уникальные элементы без использования for-loops и iteration?

Теги:
arrays
duplicates

7 ответов

582
Лучший ответ
array = array.uniq

метод uniq удаляет все повторяющиеся элементы и сохраняет все уникальные элементы в массиве.

Одна из многих красавиц языка Ruby.

  • 79
    Или в этом случае просто array.uniq! который работает на месте.
  • 45
    нет, уникальный! Метод вернет nil, если массив был еще уникальным. Например: a = [1,2,3,4] a.uniq -> [1,2,3,4] но a.uniq! -> ноль
Показать ещё 7 комментариев
67

Вы также можете вернуть пересечение.

a = [1,1,2,3]
a & a

Это также приведет к удалению дубликатов.

  • 9
    Функционально этот ответ правильный, но я думаю, что он заметно менее читабелен, чем просто использование uniq.
  • 20
    Я просто поместил это здесь, чтобы каждый, кто посещает эту страницу, видел и другие способы сделать это, я не пытался сказать, что это лучше в любом случае.
Показать ещё 1 комментарий
40

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

array.uniq  # => [1, 2, 4, 5, 6, 7, 8]

Что также может быть полезно знать, так это то, что метод uniq принимает блок, например, если у вас есть массив таких клавиш:

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"]

и вы хотите узнать, какие уникальные файлы вы можете найти:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last }
  • 5
    Я немного смущен этим. Блок используется, если вам нужна собственная функция сравнения - в вашем примере отправка uniq в этот массив без блока вернет то же значение, что и для вашего блока.
12

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

a = [1, 2, 2, 3]
counts = Hash.new(0)
a.each { |v| counts[v] += 1 }
p counts.select { |v, count| count == 1 }.keys # [1, 3]
  • 3
    Или может просто сделать a = [1, 2, 2, 3] a.find_all { |x| a.count(x) == 1 } # [1, 3]
8

Еще одна альтернатива, если кто-то заботится.

Вы также можете использовать метод to_set для массива, который преобразует Array в Set и по определению, уникальные элементы набора.

[1,2,3,4,5,5,5,6].to_set => [1,2,3,4,5,6]
0

Попробуйте с оператором XOR в Ruby:

a = [3,2,3,2,3,5,6,7].sort!

result = a.reject.with_index do |ele,index|
  res = (a[index+1] ^ ele)
  res == 0
end

print result
0

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

Проверьте полную реализацию здесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню