在Ruby中实现这一目标的最佳方法是什么? Array1
包含少量数字Array2
包含未分类的数字。我们想知道Array1
中Array2
的每个元素出现的频率。Array1 = [0,1,2,3]
Array2 = [0,0,0,3,3,3,2,1,0,3,6,1,3]
Result = {"0"=>4, "1"=>2, "2"=>1, "3"=>5}
。
示例:
Array1
有没有比这更好的最佳方式:
Array2
示例只显示了一些数字,但我想找到一个非常大的数组的最佳方法。
答案 0 :(得分:1)
您可以使用group_by
来计算array2
中的项目:
irb(main):001:0> array1 = [0,1,2,3]
=> [0, 1, 2, 3]
irb(main):002:0> array2 = [0,0,0,3,3,3,2,1,0,3,6,1,3]
=> [0, 0, 0, 3, 3, 3, 2, 1, 0, 3, 6, 1, 3]
irb(main):003:0> h = Hash[array2.group_by { |x| x }.map { |k, v| [k, v.size] }]
=> {0=>4, 3=>5, 2=>1, 1=>2, 6=>1}
如果需要,您可以使用array1
中的键提取子哈希(但我认为这不是必需的):
irb(main):004:0> h.select { |k,_| array1.include?(k) }
=> {0=>4, 3=>5, 2=>1, 1=>2}
答案 1 :(得分:0)
如果数组中的数字不是很大,那么你可以创建一个数组,其大小是任何数组的最大元素。然后迭代数组一次并将位置增加1.即
Suppose the largest element in array 2 is 10
declare an array with length 10 i.e a[10] and initialize the array with 0
Now suppose you find 1 in array2 then increment a[1]
If you find 4 in array2 then increment a[4] and so on
Then again iterate over array1 once and match the corresponding element
我没有将该语言视为Ruby,但如果你有了这个想法,那么用任何语言实现它都相当容易。 复杂性:O(n)
答案 2 :(得分:0)
a = [0,1,2,3]
b = [0,0,0,3,3,3,2,1,0,3,6,1,3]
a.inject({}){|h,i| h[i] = b.count(i); h}
#=> {0=>4, 1=>2, 2=>1, 3=>5}
或
Hash[a.map{|i| [i,b.count(i)]}]
#=> {0=>4, 1=>2, 2=>1, 3=>5}