从Ruby中删除数组中的重复元素

Mit*_*ran 307 ruby arrays ruby-on-rails duplicates

我有一个包含重复元素的Ruby数组.

array = [1,2,2,1,4,4,5,6,7,8,5,6]
Run Code Online (Sandbox Code Playgroud)

如何在不使用for循环和迭代的情况下保留所有唯一元素的同时从此数组中删除所有重复元素?

Mit*_*ran 690

array = array.uniq
Run Code Online (Sandbox Code Playgroud)

uniq的方法删除所有重复的元素并保留在阵列中的所有唯一元素.

Ruby语言的众多美女之一.

  • 或者在这种情况下只需`array.uniq!`就可以了. (80认同)
  • 不,uniq!如果数组是唯一的,则方法将返回nil,但是Ex:a = [1,2,3,4] a.uniq - > [1,2,3,4]但是a.uniq! - >没有 (50认同)
  • 我真的不认为这是红宝石语言的美丽......它只是红宝石标准库的美丽?不要误会我的意思,语言有很多美好的东西. (15认同)
  • 在Objective-C,Javascript和PHP中编写相同的内容.然后告诉我们Ruby不是一门漂亮的语言! (7认同)
  • 这也适用于复杂类型:`[{how:"是"},{u:"doing"},{how:"are"}].uniq => [{:how =>"are"},{: U => "做"}]` (2认同)
  • 关于@duykhoa所说的,uniq!方法返回nil,但你通常不关心`.uniq的返回!`它对对象本身的工作 (2认同)

jar*_*ith 80

你也可以返回十字路口.

a = [1,1,2,3]
a & a
Run Code Online (Sandbox Code Playgroud)

这也将删除重复项.

  • 我只是把它放在这里,所以无论谁访问这个页面都会看到其他的方式,我并没有试图说它在任何方面都更好. (20认同)
  • 从功能上来说,这个答案是正确的,但我认为这比使用uniq的可读性要低得多. (11认同)
  • 这样做的原因是因为在使用set操作时,结果数组被视为一个集合,这是一个通常没有重复值的数据结构.使用`a | a`(联盟)会做同样的伎俩. (3认同)

Mar*_*oda 42

您可以使用uniq方法删除重复的元素:

array.uniq  # => [1, 2, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)

可能还有用的是uniq方法需要一个块,所以例如,如果你有一个像这样的键数组:

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"]
Run Code Online (Sandbox Code Playgroud)

而你想知道什么是独特的文件,你可以找到它:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last }
Run Code Online (Sandbox Code Playgroud)

  • 我有点困惑.如果您需要自己的比较函数,则使用该块 - 在您的示例中,将`uniq`发送到没有块的数组将返回与块相同的值. (5认同)

Lri*_*Lri 17

如果有人正在寻找删除重复值的所有实例的方法,请参阅此问题.

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]
Run Code Online (Sandbox Code Playgroud)

  • 或者可以简单地做`a = [1,2,2,3] a.find_all {| x | a.count(x)== 1}#[1,3]` (3认同)

Fin*_*nks 17

如果有人关心,只是另一种选择.

您还可以使用to_set将Array转换为Set的数组方法,根据定义,set元素是唯一的.

[1,2,3,4,5,5,5,6].to_set => [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

  • 如果你关心内存,`to_set` 将分配 4 个对象,而 `uniq` 分配一个。 (5认同)

Vic*_*tor 5

对我来说最简单的方法是这些:

array = [1, 2, 2, 3]
Run Code Online (Sandbox Code Playgroud)

Array#to_set

array.to_set.to_a

# [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

Array#uniq

array.uniq

# [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)