需要帮助理解我的Ruby方法中的.sort_by块

时间:2015-07-19 21:58:06

标签: ruby

我试图通过解决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
  1. 将“chars”变量设置为text(参数),lowercased, 扫描并返回范围a-z或A-Z之间的任何单个字符 然后将它们从最低到最高排序。

  2. 使用 .map 设置关键变量并返回所有字符 在提交的数组中,键的总数(x), 然后使用.uniq方法使所有charecteds都是唯一的。

  3. 然后使用“y”键对给定的块进行排序以返回全部 提交的负数/正数及其计数 阵列。

  4. 万分感谢!

1 个答案:

答案 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有点简写,因为我们不会将哈希的密钥用于任何内容。