我有一个像这样的数组['n','n','n','s','n','s','n','s','n','s']
,我想检查是否有相等的字符计数。在上面的例子中,我有6个n
和4个s
所以它们是不相等的,我试过了,但是没有什么是正确的。我如何使用Ruby做到这一点?
给定数组:
a = ['n','n','n','s','n','s','n','s','n','s']
按数组的元素分组,只取该组的值:
(f,s) = a.group_by{|e| e}.values
比较大小:
f.size == s.size
Result: false
或者你可以试试这个:
x = ['n','n','n','s','n','s','n','s','n','s']
x.group_by {|c| c}.values.map(&:size).inject(:==)
你可以这样写:
def eq_num? arr
return false if arr.size == 1
arr.uniq.map {|i| arr.count(i)}.uniq.size == 1
end
arr = ['n','n','n','s','n','s','n','s','n','s']
eq_num? arr #=> false
arr = ['n','n','n','s','n','s','s','s']
eq_num? arr #=> true
也适用于两种以上的字母:
arr = ['n','n','t','s','n','t','s','s','t']
eq_num? arr #=> true
使用array# count是相对低效的,因为它需要对每个被计数实例的元素进行一次完整的遍历。相反,像其他人那样使用Enumerable#group_by,或者使用计数哈希,如下所示(参见hash::new):
def equal_counts?(arr)
arr.each_with_object(Hash.new(0)) { |s,h| h[s] += 1 }.values.uniq.size == 1
end
equal_counts? ['n','n','n','s','n','s','n','s','n','s']
#=> false
equal_counts? ['n','r','r','n','s','s','n','s','r']
#=> true
arr = ['n','n','n','s','n','s','n','s','n','s']
步骤如下:
h = arr.each_with_object(Hash.new(0)) { |s,h| h[s] += 1 }
#=> {"n"=>6, "s"=>4}
a = h.values
#=> [6, 4]
b = a.uniq
#=> [6, 4]
b.size == 1
#=> false