Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在范围和计数的散列中对整数数组进行分组_Arrays_Ruby_Hash_Grouping - Fatal编程技术网

Arrays 在范围和计数的散列中对整数数组进行分组

Arrays 在范围和计数的散列中对整数数组进行分组,arrays,ruby,hash,grouping,Arrays,Ruby,Hash,Grouping,我有这样一个整数数组: [1, 1, 1, 2, 2, 4, 4, 5, 6, 11, 11, 12, 15, 22, 23, 23, 23, 31, 32, 32] 我正在尝试将其转换为散列,按照间隔10的范围进行分组 因此,在这种情况下,它将是 { [1..10] => 9, [11..20] => 4, [21..30] => 4, [31..40] => 3 } 我试过一些还没有接近的东西,所以把它们放在这里是没有意义的。我可以将数组转换为范围 [1,

我有这样一个整数数组:

  [1, 1, 1, 2, 2, 4, 4, 5, 6, 11, 11, 12, 15, 22, 23, 23, 23, 31, 32, 32]
我正在尝试将其转换为散列,按照间隔10的范围进行分组

因此,在这种情况下,它将是

{ [1..10] => 9, [11..20] => 4, [21..30] => 4, [31..40] => 3 }
我试过一些还没有接近的东西,所以把它们放在这里是没有意义的。我可以将数组转换为范围

  [1, 1, 1, 2, 2, 4, 4, 5, 6, 11, 11, 12, 15, 22, 23, 23, 23, 31, 32, 32].sort.uniq.inject([]) do |spans, n|
    if spans.empty? || spans.last.last != n - 1
      spans + [n..n]
    else
      spans[0..-2] + [spans.last.first..n]
    end
   end

但这不是我想要的。有什么建议吗?

我修改了示例,使其没有介于21和30之间的数字,因此哈希应该包括键值对
21..30=>0

Hash[
  your_array.group_by{|i| i / 10}.map{|k,v|
    [(k*10+1..(k+1)*10), v.count]
  }
]
#=> {1..10=>9, 11..20=>4, 21..30=>4, 31..40=>3}
arr = [1, 1, 1, 2, 2, 4, 4, 5, 6, 11, 11, 12, 20, 32, 33, 33, 33, 41, 42, 42]

intervals = (1..arr.last-1).step(10).each_with_object({}) { |n,h| h[n..n+9] = 0 }
  #=> {1..10=>0, 11..20=>0, 21..30=>0, 31..40=>0, 41..50=>0}

arr.each_with_object(intervals) do |n,intervals|
  interval_end = 10*((n+9)/10)     
  intervals[interval_end-9..interval_end] += 1
end
  #=> {1..10=>9, 11..20=>4, 21..30=>0, 31..40=>4, 41..50=>3} 

我修改了这个示例,使其没有介于21和30之间的数字,因此散列应该包括键值对
21..30=>0

arr = [1, 1, 1, 2, 2, 4, 4, 5, 6, 11, 11, 12, 20, 32, 33, 33, 33, 41, 42, 42]

intervals = (1..arr.last-1).step(10).each_with_object({}) { |n,h| h[n..n+9] = 0 }
  #=> {1..10=>0, 11..20=>0, 21..30=>0, 31..40=>0, 41..50=>0}

arr.each_with_object(intervals) do |n,intervals|
  interval_end = 10*((n+9)/10)     
  intervals[interval_end-9..interval_end] += 1
end
  #=> {1..10=>9, 11..20=>4, 21..30=>0, 31..40=>4, 41..50=>3} 

在我看来更像O(3n)。但是您的解决方案确实更快。对于
您的_数组=[5,25]
,您的解决方案返回
=>{1..10=>1,21..30=>1}
,而不是
{1..10=>1,11..20=>0,21..30=>1}
。如果您的散列值是
h
,则可以添加
h.default=0
。在我看来更像O(3n)。但是您的解决方案确实更快。对于
您的_数组=[5,25]
,您的解决方案返回
=>{1..10=>1,21..30=>1}
,而不是
{1..10=>1,11..20=>0,21..30=>1}
。如果您的哈希值为
h
,则可以添加
h.default=0
。我对@Mladan答案的评论也适用于您的答案。@CarySwoveland确实如此,但当明确请求时,我的返回
0
result[11..20]#⇒ 0
:)哇!我错过了散列定义。我刚刚更改了上面的评论,以表明这一点,但和往常一样,您领先了一步。我对@Mladan答案的评论也适用于您的答案。@CarySwoveland确实如此,但我的评论在明确请求时返回
0
result[11..20]#⇒ 0
:)哇!我错过了散列定义。我刚刚改变了我上面的评论,表示,但和往常一样,你领先了一步。