【问题标题】:Ruby Hashing - Multiple Keys [closed]Ruby Hashing - 多个键 [关闭]
【发布时间】:2013-04-20 01:11:37
【问题描述】:

我有一个从数据库中获取的 Ruby 数组,当我打印它时看起来像这样:

<% @Aarr.each do |row1| %>
<%= row1[0] %>  :   <%= row1[1] %> :   <%= row1[2] %>
<br>
<% end %>

输出:

10.0.1.50 : 8k : IP 
10.0.1.50 : 8k : UMTS 
10.0.1.51 : 8k : IP 
10.0.1.51 : 8k : UMTS 
10.0.1.50 : 9k : IP 
10.0.1.50 : 9k : Stability 
10.0.1.50 : 9k : UMTS 
11.0.1.50 : 9k : IP 
11.0.1.50 : 9k : UMTS 

我想对此应用某种散列,结果应如下所示:

10.0.1.50 : 8k : 2
10.0.1.51 : 8k : 2
10.0.1.50 : 9k : 3
11.0.1.50 : 9k : 2

所以基本上我希望键是数组的前两列。

【问题讨论】:

  • 你试过了吗?
  • 您有什么特别的问题,而不是“为我做我的工作”吗?
  • 你当前的数据库查询是什么?
  • 我尝试使用普通哈希,如下所示:@Arr_new = @Arr.inject(Hash.new(0)) { |hash,element| hash[element] +=1 hash } 但它没有返回我想要的输出
  • @MarkThomas :我知道我可以在查询数据库时做到这一点。但我想在应用程序的多个地方使用这个数组。因此,与在我的应用程序中创建另一个数组相比,触发多个查询是个坏主意。

标签: ruby-on-rails ruby arrays ruby-on-rails-3 hash


【解决方案1】:

您可以尝试以下方法:

result = {}
@your_array.map{|row| "#{row[0]} : #{row[1]}"}.each do |key|
  result[key] = (result[key] ||= 0) + 1
end

不过,我同意您原始帖子的用户 cmets,db 应该更好地处理这个问题。

【讨论】:

  • 不错的答案,+1。如果你也想的话,你也可以使用each_with_object 来删除额外的本地。
  • @iain Ruby 新手,要学的东西太多了!感谢您的提示!
【解决方案2】:

您可以使用group_by将它们按前两列分组,然后返回每组的长度以获得您想要的输出:

arr.group_by{|row| row.take(2)}.map{|k,v| [k, v.length].flatten.join " : "}

输出:

10.0.1.50 : 8k : 2
10.0.1.51 : 8k : 2
10.0.1.50 : 9k : 3
11.0.1.50 : 9k : 2

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 2011-11-15
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多