如何在ruby中对该数组重新排序?
我有这个:如何在ruby中对该数组重新排序?,ruby,Ruby,我有这个: list = [[apple, John], [apple, Paul], [banana, Paul]] 像这样: list = [[apple, [John, Paul]], [banana, [Paul]] 我不知道如何解决这个问题,因为我需要知道每个元素的频率,并根据整个列表对它们重新排序 list.group_by(&:first).map { |fruit, preferences| [fruit, preferences.map(&:last)] }
list = [[apple, John], [apple, Paul], [banana, Paul]]
像这样:
list = [[apple, [John, Paul]], [banana, [Paul]]
我不知道如何解决这个问题,因为我需要知道每个元素的频率,并根据整个列表对它们重新排序
list.group_by(&:first).map { |fruit, preferences| [fruit, preferences.map(&:last)] }
使用,根据哈希中的键聚合所有值,然后转换回数组
list.each_with_object(Hash.new{[]}) { |x, h| h[x.first] <<= x.last }.to_a
=> [["apple", ["John", "Paul"]], ["banana", ["Paul"]]]
还有一条路
list = [%w|apple John|, %w|apple Paul|, %w|banana Paul|]
#=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]]
list.each_with_object({}) { |(fruit,name),h| h.update(fruit=>[name]) { |_k,o,n| o+n } }
#=> {"apple"=>["John", "Paul"], "banana"=>["Paul"]}
这使用了aka合并的形式!它使用块{| uk,o,n | o+n}来确定合并的两个哈希中存在的键的值。有关三个块变量_k、o和n的定义,请参见文档。下划线告诉读者,块计算中不使用通常只写的k 您的数据结构不是有效的Ruby数据结构。还有,你试过什么?是为了帮助您解决所编写代码的问题,而不是为您编写代码!请提供所需输入和输出的规格,包括转角情况和例外情况。给出有效输入和所需输出的示例,包括演示拐角情况的示例。也许阅读,调查,采取和检查。你可能希望使用散列。
list = [%w|apple John|, %w|apple Paul|, %w|banana Paul|]
#=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]]
list.each_with_object({}) { |(fruit,name),h| h.update(fruit=>[name]) { |_k,o,n| o+n } }
#=> {"apple"=>["John", "Paul"], "banana"=>["Paul"]}