我有一些文字要检查相同的字符。当我检查时: 放置file.count(“ AB”)。结果:399,但应该是3
alphabet = ["A","B","C","D","E","F","G","H","I","J",
"K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"," ",".",",",";",
"-","'"
]
file = File.read("vt_00.txt")
i = 0
while i < alphabet.count do
single_char_count = file.count(alphabet[i])
puts "#{alphabet[i]} = #{single_char_count}"
j = 0
while j < alphabet.count do
two_chars = alphabet[i] + alphabet[j]
two_chars_count = file.count(two_chars)
puts "#{two_chars} = #{two_chars_count}"
j += 1
end
i += 1
end
当我检查时: 放置file.count(“ AB”)。结果:399,但应该是3
答案 0 :(得分:4)
String#count
以另一种方式工作。
它计算参数中的字符在原始字符串中出现的次数。
例如:
"aaaa aaab".count("ab")
# => 8
您需要的是String#scan
。
"aaaa aaab".scan("ab").count
# => 1
答案 1 :(得分:3)
我相信您的特定问题已得到解答。我想建议一种有效的方法来获取所需的子字符串数。
没有必要将子字符串提取到临时数组中,然后返回数组的大小:
"aaba aaab".gsub("ab").count { true }
#=> 2
这使用String#gsub的未充分利用的形式,该形式使用参数和无块调用,在这种情况下,它返回一个枚举器(与字符串替换无关)。将其视为方法String#each_match
。
Enumerable#count然后计算该块的值为真的每个匹配。我让代码块始终返回true
,但是"My dog has fleas."
也会同样有效。
答案 2 :(得分:0)
如果您要计算文件中某种模式的次数,可以尝试执行以下操作。
2.6.3 :008 > "ab aaa ba ab".scan(/ab/).size
=> 2
2.6.3 :009 > "ab aaa ba ab".scan("ab").size
=> 2
2.6.3 :010 > "ab aaa ba ab".split("ab").size
=> 2
如果文件很大,这在cpu中不是最佳选择,但是我认为可以使用。