Arrays 迭代对象数组。然后访问对象方法(如果找到正确的方法)。否则,在数组中创建一个新对象

Arrays 迭代对象数组。然后访问对象方法(如果找到正确的方法)。否则,在数组中创建一个新对象,arrays,ruby,Arrays,Ruby,我从一个空数组和一个键值散列开始 我想迭代散列并将其与空数组进行比较。如果数组中不存在每个k,v对的值,我想创建一个具有该值的对象,然后访问一个对象方法,将密钥附加到对象内部的数组中 这是我的密码 class Test def initialize(name) @name = name @values = [] end attr_accessor :name def values=(value) @values << val

我从一个空数组和一个键值散列开始

我想迭代散列并将其与空数组进行比较。如果数组中不存在每个k,v对的值,我想创建一个具有该值的对象,然后访问一个对象方法,将密钥附加到对象内部的数组中

这是我的密码

class Test

   def initialize(name)
     @name = name
     @values = []
   end

   attr_accessor :name

   def values=(value)
     @values << value
   end

   def add(value)
     @values.push(value)
   end


end

l = []

n = {'server_1': 'cluster_x', 'server_2': 'cluster_y', 'server_3': 'cluster_z', 'server_4': 'cluster_x', 'server_5': 'cluster_y'}

n.each do |key, value|
  l.any? do |a|
    if a.name == value
      a.add(key)
    else
      t = Test.new(value)
      t.add(key)
      l << t
    end
  end
end

p l
类测试
def初始化(名称)
@name=name
@值=[]
结束
属性存取器:名称
def值=(值)

@“价值观”@Cyzanfar给了我一个寻找什么的线索,我在这里找到了答案

n.每个do |键、值|
found=l.detect{| e | e.name==value}
如果找到
找到。添加(键)
其他的
t=测试。新(值)
t、 添加(键)

阿尔,你快到了!最后需要考虑的是,<代码>发现实际上返回一个对象,因为<代码>检测在某个点会找到匹配的对象。
 n.each do |key, value|
    found = l.detect {|e| e.name == value}
    if found
      found.add(key)
    else
      t = Test.new(value)
      t.add(key)
      l << t
    end
end

我在您的代码中观察到两件事:

   def values=(value)
     @values << value

   def add(value)
     @values.push(value)
执行:

$ ruby -w t.rb 
server=server_1, cluster=cluster_x
cluster_found=nil
server=server_2, cluster=cluster_y
cluster_found=nil
server=server_3, cluster=cluster_z
cluster_found=nil
server=server_4, cluster=cluster_x
cluster_found=#<Test:0x007fa7a619ae10 @name="cluster_x", @values=[:server_1]>
server=server_5, cluster=cluster_y
cluster_found=#<Test:0x007fa7a619ac58 @name="cluster_y", @values=[:server_2]>
[#<Test:0x007fa7a619ae10 @name="cluster_x", @values=[:server_1, :server_4]>,
 #<Test:0x007fa7a619ac58 @name="cluster_y", @values=[:server_2, :server_5]>,
 #<Test:0x007fa7a619aac8 @name="cluster_z", @values=[:server_3]>]
$ruby-w t.rb
服务器=服务器1,群集=群集x
找到的群集=零
服务器=服务器2,群集=群集
找到的群集=零
服务器=服务器3,集群=集群
找到的群集=零
服务器=服务器4,群集=群集x
找到群集=#
服务器=服务器5,集群=集群
找到群集=#
[#,
#,
#]

l.any?
将始终是错误的,因为您从未向其添加任何内容。可能还想看看
groupby
,可能会或可能不会在这里帮助您:
n.groupby{| |,v | v}/code>或
n.keys.groupby{| key | n[key]}
干得好!我在这里看到的唯一问题是你的最后一行
l@cyzanfar绝对正确,我也注意到了这一点。非常感谢你的建议!哦,太棒了:)刚刚添加了一个答案,没有看到你最后的评论:)。和+1表示发现错误!
[
#<Test:0x007ff8d10cd3a8 @name=:cluster_x, @values=["server_1, server_4"]>, 
#<Test:0x007ff8d10cd2e0 @name=:cluster_y, @values=["server_2, server_5"]>, 
#<Test:0x007ff8d10cd1f0 @name=:cluster_z, @values=["server_3"]>
]
   def values=(value)
     @values << value

   def add(value)
     @values.push(value)
class Test
  def initialize(name, value)
    @name   = name
    @values = [value]
  end

  def add(value)
    @values << value
  end
end

h_cluster = {} # intermediate hash whose key is the cluster name

n = {'server_1': 'cluster_x', 'server_2': 'cluster_y', 'server_3': 'cluster_z',
     'server_4': 'cluster_x', 'server_5': 'cluster_y'}

n.each do | server, cluster |
  puts "server=#{server}, cluster=#{cluster}"
  cluster_found = h_cluster[cluster] # does the key exist ? => nil or Test 
                                     # instance with servers list
  puts "cluster_found=#{cluster_found.inspect}"

  if cluster_found
  then # add server to existing cluster
    cluster_found.add(server)
  else # create a new cluster
    h_cluster[cluster] = Test.new(cluster, server)
  end
end

p h_cluster.collect { | cluster, servers | servers }
$ ruby -w t.rb 
server=server_1, cluster=cluster_x
cluster_found=nil
server=server_2, cluster=cluster_y
cluster_found=nil
server=server_3, cluster=cluster_z
cluster_found=nil
server=server_4, cluster=cluster_x
cluster_found=#<Test:0x007fa7a619ae10 @name="cluster_x", @values=[:server_1]>
server=server_5, cluster=cluster_y
cluster_found=#<Test:0x007fa7a619ac58 @name="cluster_y", @values=[:server_2]>
[#<Test:0x007fa7a619ae10 @name="cluster_x", @values=[:server_1, :server_4]>,
 #<Test:0x007fa7a619ac58 @name="cluster_y", @values=[:server_2, :server_5]>,
 #<Test:0x007fa7a619aac8 @name="cluster_z", @values=[:server_3]>]