2015-07-19 114 views
0

我试图通过解决Code Wars问题来改进我的编码,并以特定的方式进行编码。首先,我尝试自己编写代码。如果我做了几次谷歌搜索(堆栈交换)来排除故障。如果我没有解开问题的答案,然后彻底检查它并以书面形式表述代码,那么我就能理解答案中的代码。那么,今天我不得不选择后者。需要帮助了解我的Ruby方法中的.sort_by块

我理解了代码的大部分份额,但是我对第四行中的代码的理解有点摇摆不定。我已经围绕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. 设置“字符”变量为文本(参数),小写, 扫描并返回范围AZ或AZ之间的任何单个性格特征,和 然后排序它们低到高。

  2. 使用.MAP设置一个关键变量与总数返回所有charecters 的提交阵列内的键(X), 然后让所有charecteds唯一与.uniq方法。

  3. 然后排序与使用“Y”键返回负/正数的所有 及其计数提交 阵列中的给定块。


万分感谢!

回答

1

sort_by确实听起来很像。它可以让你根据一些标准(你传递给一个块)“散列”一个散列。由于哈希真的没有订单,它返回由您在块传递的标准排序的数组:

考虑以下哈希(在“你好”的字符数):

chars = {"h"=>1, "e"=>1, "l"=>2, "o"=>1}

关键是字符,值是计数。

chars.sort_by { |key, value| value }

这将返回如下:

[["h", 1], ["e", 1], ["o", 1], ["l", 2]]

如果我们想字符数组排序基于其数,我们可以基于像这样的值以上哈希运行 sort_by

如果我们想首先最常见的人物,我们最好排序上-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块中的_有点简化,因为我们没有使用散列的密钥作为任何事情。

+0

您的方法实现与原始行为不同;它不会按字母顺序排列。 – Kimball