这是行:
words.group_by { |word| word.downcase.chars.sort }.values
words
是一个单词数组,如果它们与原始数组中的另一个单词共享相同的字母,则将这些单词分组。有人可以下线并解释这是如何工作的吗?
好,我们来一一介绍方法:
group_by
: 是一个方法,它需要一个Enumerable
(在这种情况下是一个数组)和一个块。它将数组中的每个值传递给块,然后查看块的结果。然后它返回一个哈希,其中键是块的结果,值是具有相同结果的原始输入的数组。
downcase
: 接受一个字符串并将其全部小写
chars
: 将字符串转换为字符数组
sort
: 对集合进行排序
values
: 只返回 a 的值Hash
。
有了这些定义,让我们回到你的代码:
words.group_by { |word| word.downcase.chars.sort }.values
“取
word
数组中的每一个words
,将其设为小写,然后将其字母按字母顺序排序。包含完全相同字母的单词将具有相同的排序结果,因此我们可以将它们分组为一个 Hash of Arrays,用排序后的字母作为键和匹配单词的数组作为值。我们实际上并不关心实际的字母是什么,只关心共享它们的单词,所以我们只取数组(thevalues
)。
用一个例子来分解它:
words = %w[throw worth threw Live evil]
# => [ 'throw', 'worth', 'threw', 'Live', 'evil' ]
words_hash = words.group_by {|word| word.downcase.chars.sort}
# => {
# 'eilv' => [ 'evil', 'Live' ],
# 'ehrtw' => [ 'threw'],
# 'hortw' => [ 'throw', 'worth']
# }
words_hash.values
# => [['evil', 'Live'], ['threw'], ['throw', 'worth']]