我有一个字符串
s = "chineedne"
我正在尝试创建一个可以计算字符串或任何字符串中重复字符数量的函数
尝试
s.each_char.map { |c| c.find.count { |c| s.count(c) > 1 }}
#=> NoMethodError: undefined method `find' for "c":String
答案 0 :(得分:2)
你可以简单地统计你的角色:
chars_frequency = str.each_char
.with_object(Hash.new(0)) {|c, m| m[c]+=1}
=> {"c"=>1, "h"=>1, "i"=>1, "n"=>2, "e"=>3, "d"=>1}
然后算一下:
chars_frequency.count { |k, v| v > 1 }
=> 2
或(如果你想计算总金额):
chars_frequency.inject(0) {|r, (k, v)| v > 1 ? r + v : r }
=> 5
答案 1 :(得分:1)
可能的解决方案:
string = "chineedne"
string.chars.uniq.count { |char| string.count(char) > 1 }
#=> 2
或没有uniq
方法来计算重复字符的总数:
string = "chineedne"
string.chars.count { |char| string.count(char) > 1 }
#=> 5
为了摆脱N ** 2的复杂性,您还可以使用group_by
方法创建带有character
- >的哈希值array
包含来自string
的所有字符,而不仅仅是使用此哈希来获取您想要的任何数据:
duplicates = string.chars.group_by { |char| char }.select { |key, value| value.size > 1 }
# or, for Ruby version >= 2.2.1 - string.chars.group_by(&:itself).select { |key, value| value.size > 1 }
比:
> duplicates.keys.size # .keys => ['n', 'e']
#=> 2
和
> duplicates.values.flatten.size # .values.flatten => ["n", "n", "e", "e", "e"]
#=> 5
答案 2 :(得分:0)
我不太了解红宝石,但我认为这样的事情应该有效
yourstring = "chineedne"
count = 0
"abcdefghijklmnopqrstuvwxyz".split("").each do |c|
if (yourstring.scan(c).count > 1
count = count+1
end
end
count变量表示重复字符的数量 https://stackoverflow.com/a/12428037/6371926
答案 3 :(得分:0)
string = "chineedne"
#遍历每个字符创建数组 #小写,以防我们要区分大小写
arr = string.downcase.chars
#提取uniq字符并计数多少次 #它们多次出现在数组中
arr.uniq.count {|n| arr.count(n) > 1}