我试图通过解决Code Wars问题来改进我的编码,并且我正在以特定的方式进行编码。首先,我尝试自己编写代码。如果没有我做一些Google搜索(Stack Exchange)来排除故障。如果没有解决问题的答案,然后彻底检查并以书面形式表达代码,那么我就能理解答案中的代码。好吧,我今天不得不接受后者。
我理解代码的大部分内容,但是我对第四行中的代码的理解感到有些不稳定。我已经围绕Rubydocs上的代码中使用的方法进行了大量研究,但仍然感觉很黑暗。有人可以为我说清楚它的一部分吗?我也正在寻找关于我目前的代码清晰度的任何建议。
def letter_frequency(text)
chars = text.downcase.scan(/[a-zA-Z]/).sort
chars.map { |x| [x, chars.count(x)] }.uniq
.sort_by { |y| [-y[1], y[0]] }
end
将“chars”变量设置为text(参数),lowercased, 扫描并返回范围a-z或A-Z之间的任何单个字符 然后将它们从最低到最高排序。
使用 .map 设置关键变量并返回所有字符 在提交的数组中,键的总数(x), 然后使用.uniq方法使所有charecteds都是唯一的。
然后使用“y”键对给定的块进行排序以返回全部 提交的负数/正数及其计数 阵列。
万分感谢!
答案 0 :(得分:1)
sort_by
几乎听起来像它。它可以让你排序"基于某些条件的哈希(传递给块)。由于哈希没有真正的订单,它会返回一个按照您在块中传递的条件排序的数组:
考虑以下哈希值(' hello'中的字符数):
chars = {"h"=>1, "e"=>1, "l"=>2, "o"=>1}
键是字符,值是计数。如果我们想要一个基于计数的排序字符数组,我们可以根据这样的值在上面的哈希上运行sort_by
:
chars.sort_by { |key, value| value }
这将返回以下内容:
[["h", 1], ["e", 1], ["o", 1], ["l", 2]]
如果我们想要最常见的字符,我们会对-value
进行排序:
chars.sort_by { |key, value| -value }
将返回以下内容:
[["l", 2], ["h", 1], ["e", 1], ["o", 1]]
我通过一些调整重写了你的方法:
def letter_frequency(text)
count = Hash.new 0
chars = text.downcase.scan(/[a-zA-Z]/)
chars.each do |char|
count[char] += 1
end
count.sort_by { |_, value| -value }
end
首先,count
是存储文本字符计数的哈希值,然后我们按每个字符的计数(value
)进行排序。 _
块中的sort_by
有点简写,因为我们不会将哈希的密钥用于任何内容。