如何在ruby中重新排序这个数组?

时间:2017-05-12 14:19:06

标签: ruby

我有这个:

list = [[apple, John], [apple, Paul], [banana, Paul]]

是这样的:

list = [[apple, [John, Paul]], [banana, [Paul]]

我不知道如何解决这个问题,因为我需要知道每个元素的频率,并根据整个列表重新排序......

3 个答案:

答案 0 :(得分:2)

list.group_by(&:first).map { |fruit, preferences| [fruit, preferences.map(&:last)] }

答案 1 :(得分:1)

list = [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]]  
=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]]

使用Enumberable#each_with_object,根据哈希中的键聚合所有值,然后转换回数组

list.each_with_object(Hash.new{[]}) { |x, h| h[x.first] <<= x.last }.to_a
=> [["apple", ["John", "Paul"]], ["banana", ["Paul"]]]

答案 2 :(得分:0)

还有一种方法。

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"]}

这使用Hash#update(aka merge!)的形式,它使用块({ |_k,o,n| o+n })来确定合并的两个哈希中存在的键的值。有关三个块变量的定义,请参阅doc _kon。下划线告诉读者在块计算中不使用_k(通常只写_)。

相关问题