Ruby数组的减法运算?

3
要翻译的文本为:

我要么不理解从数组中减去另一个数组时会发生什么,要么这里出了什么问题。

我有一个用户名(字符串)列表存储在一个数组中:

users.count - users.uniq.count    # => 9
users - users.uniq                # => []

我不确定这是怎么可能的。
我基本上在尝试找到重复项列表。我知道还有其他方法可以做到这一点,只是想更好地了解数组操作。
以下是我用来获得相同结果的解决方案代码:
users.inject(Hash.new(0)) {|h,i| h[i] += 1; h}.select{|k,v| v > 1}
2个回答

7

你可以使用

dups = users.select{|e| users.count(e) > 1 }.uniq

或者,仅查找单个重复元素:

firstDup = users.detect {|e| users.count(e) > 1 }

关于数组减法,以下是一些解释:

a = [1, 1, 1, 1, 1]
a - [1] # => []

数组减法会移除所有的匹配项,而不仅仅是其中一个。


4

Array#- 的行为是非常正确的。它会返回原始数组的副本,删除任何在其他数组中也出现的项。

用户列表(包括重复项)去除所有用户后为空。

从 "Ruby: How to find and return a duplicate value in array?" 得知,以下方法可以很好地在一个数组中找到重复项:

users.detect {|e| users.rindex(e) != users.index(e) }

只为了提高性能而仅进行一次搜索: users.select.with_index { |e,i| users.rindex(e) != i }如果还需要索引,则使用以下代码: users.each.with_index.select { |e,i| users.rindex(e) != i } - Kaplan Ilya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接