如何使用Ruby检查一个数组是否包含相同数量的字符



我有一个像这样的数组['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

最新更新