具有多个值的Ruby数组按键分组
我有一个Ruby数组:具有多个值的Ruby数组按键分组,ruby,arrays,hashtable,Ruby,Arrays,Hashtable,我有一个Ruby数组: [ {tags: [1,2]}, {tags: [1,3]}, {tags: [1,4]}, {tags: [2,4]}, {tags: [2,5]} ] 我需要按对象的标记对对象进行分组: { 1: [{tags: [1,2]}, {tags: [1,3]}, {tags: [1,4]}], 2: [{tags: [1,2]}, {tags: [2,4]}, {tags: [2,5]}], 3: [{ta
[
{tags: [1,2]},
{tags: [1,3]},
{tags: [1,4]},
{tags: [2,4]},
{tags: [2,5]}
]
我需要按对象的标记对对象进行分组:
{
1: [{tags: [1,2]}, {tags: [1,3]}, {tags: [1,4]}],
2: [{tags: [1,2]}, {tags: [2,4]}, {tags: [2,5]}],
3: [{tags: [1,3]}],
4: [{tags: [1,4]}, {tags: [2,4]}],
5: [{tags: [2,5]}]
}
有没有神奇的Ruby方法可以做到这一点?使用:
标记=[
{tags:[1,2]},
{tags:[1,3]},
{tags:[1,4]},
{tags:[2,4]},
{标记:[2,5]}
]
标记。每个带有_对象的_(Hash.new{| h,k | h[k]=[]){| h,result|
h[:tags]。每个{n |结果[n]{1=>[{:tags=>[1,2]},{:tags=>[1,3]},{:tags=>[1,4]},
#2=>[{:tags=>[1,2]},{:tags=>[2,4]},{:tags=>[2,5]}],
#3=>[{:tags=>[1,3]}],
#4=>[{:tags=>[1,4]},{:tags=>[2,4]}],
#5=>[{:tags=>[2,5]}]}
我会这样做:
array = [{tags: [1,2]}, {tags: [1,3]}, {tags: [1,4]}, {tags: [2,4]}, {tags: [2,5]}]
result = Hash.new { |hash, key| hash[key] = [] }
array.each do |tags|
tags[:tags].each { |tag| result[tag] << tags }
end
puts result
#=> {1=>[{:tags=>[1, 2]}, {:tags=>[1, 3]}, {:tags=>[1, 4]}],
# 2=>[{:tags=>[1, 2]}, {:tags=>[2, 4]}, {:tags=>[2, 5]}],
# 3=>[{:tags=>[1, 3]}],
# 4=>[{:tags=>[1, 4]}, {:tags=>[2, 4]}],
# 5=>[{:tags=>[2, 5]}]}
array=[{tags:[1,2]},{tags:[1,3]},{tags:[1,4]},{tags:[2,4]},{tags:[2,5]}]
result=Hash.new{| Hash,key | Hash[key]=[]}
array.each do|标记|
标记[:标记]。每个{标记|结果[标记]{1=>[{:标记=>[1,2]},{:标记=>[1,3]},{:标记=>[1,4]},
#2=>[{:tags=>[1,2]},{:tags=>[2,4]},{:tags=>[2,5]}],
#3=>[{:tags=>[1,3]}],
#4=>[{:tags=>[1,4]},{:tags=>[2,4]}],
#5=>[{:tags=>[2,5]}]}
我建议如下:
tags.each_with_object({}) {|g,h| g.values.flatten.each {|i| (h[i]||=[]) << g}}
#=> {1=>[{:tags=>[1, 2]}, {:tags=>[1, 3]}, {:tags=>[1, 4]}],
# 2=>[{:tags=>[1, 2]}, {:tags=>[2, 4]}, {:tags=>[2, 5]}],
# 3=>[{:tags=>[1, 3]}],
# 4=>[{:tags=>[1, 4]}, {:tags=>[2, 4]}],
# 5=>[{:tags=>[2, 5]}]}
tags.each_with_object({}){{g,h{g.values.flatte.each{i}(h[i]| |=[]){1=>[{:tags=>[1,2]},{:tags=>[1,3]},{:tags=>[1,4]},
#2=>[{:tags=>[1,2]},{:tags=>[2,4]},{:tags=>[2,5]}],
#3=>[{:tags=>[1,3]}],
#4=>[{:tags=>[1,4]},{:tags=>[2,4]}],
#5=>[{:tags=>[2,5]}]}
这里面有什么问题吗?你有什么具体的问题吗?@MarkThomas问题在标题中。给定一个Ruby哈希元素数组,我想根据每个哈希的数组属性中的值对这些元素进行索引。用文字描述比向你展示代码更难。因此,我提出了一个简洁的问题w专注于代码。@MarkThomas,这个问题类似于:“序列3、9、18、30、45中的下一个数字是什么?”在阅读答案之前,我无法理解这个问题。似乎如果I
满足h[:tags]。包含?[I]=>true
对于五个哈希值h
中的至少一个,则i
是返回哈希值中的一个键,其值是所有哈希值h
的数组,其中h[:标记]。包括?[i]=>true
(序列中的下一个元素由3(n+n^2)/2
给出)不要只把问题放在标题中,也要在问题的主体中重申它。此外,我没有看到任何代码,只有散列的定义,但没有任何可能操纵它或创建它的内容。我们需要知道你写了什么来尝试自己解决这个问题。堆栈溢出不是“为我编写代码”服务,而是“我需要我编写的代码的帮助"服务。是一个由社区维护/主持的网站,目标是成为类似维基百科的编程问题和解决方案概要。因此,有强烈鼓励的问题标准,当遵循这些标准时,可以帮助我们回答问题,其他搜索类似答案的人可以找到这些问题。作为大约有一段时间,我意识到了这些事情,并试图帮助你完成这些。回答得好,很感谢你找出了问题所在。谢谢@spickermann。这与我自己的想法类似,但你将块传递给散列。新建是一种优雅的方式。你一定也找到了问题所在,consi你的答案紧跟着falsetru的答案。仅此一点+1,但答案也不错。
tags.each_with_object({}) {|g,h| g.values.flatten.each {|i| (h[i]||=[]) << g}}
#=> {1=>[{:tags=>[1, 2]}, {:tags=>[1, 3]}, {:tags=>[1, 4]}],
# 2=>[{:tags=>[1, 2]}, {:tags=>[2, 4]}, {:tags=>[2, 5]}],
# 3=>[{:tags=>[1, 3]}],
# 4=>[{:tags=>[1, 4]}, {:tags=>[2, 4]}],
# 5=>[{:tags=>[2, 5]}]}