我需要将数组拆分为X更小的数组。我不关心较小数组中的元素数量,我只需要从较大的数组中创建X数组。我一直在做一些阅读,似乎我需要一种类似于rails的in_groups方法的方法。我现在不使用rails,只是ruby。
答案 0 :(得分:4)
要求Rails只是为了获得该功能是过度的。只需使用each_slice
:
team = ['alice', 'andy', 'bob', 'barry', 'chloe', 'charlie']
=> ["alice", "andy", "bob", "barry", "chloe", "charlie"]
team.each_slice(2).to_a
=> [["alice", "andy"], ["bob", "barry"], ["chloe", "charlie"]]
each_slice
的参数是每个切片中的元素数量(可能是最后一个切片除外)。由于您正在寻找X切片,您可以执行以下操作:
team.each_slice(team.length/X).to_a
这并不完美,因为如果数组长度不是X的倍数,你会得到一个额外的切片,但是让你进入球场,你可以从那里调整它,具体取决于你的确切情况需求是。
由于您说您并不关心每个中有多少,您可以使用上面的length/x
方法,然后检查您是否有太多切片。如果是这样,只需将最后两个切片连接到一个巨型切片中。这可能会避免一些繁琐的数学运算或浮点运算。
答案 1 :(得分:3)
你可以制作自己的方法,这是一个基本的想法:
class Array
def my_group(x)
start = 0
size = (self.size() / Float(x)).ceil
while x > 0
yield self[start, size]
size = ((self.size() - 1 - start) / Float(x)).ceil
start += size
x -= 1
end
end
end
%w(1 2 3 4 5 6 7 8 9 10).my_group(3) {|group| p group}
# =>["1", "2", "3", "4"]
# =>["4", "5", "6"]
# =>["7", "8", "9"]
答案 2 :(得分:1)
我决定把:
require 'active_support/core_ext/array/grouping'
答案 3 :(得分:0)
如果需要N个组,则可以使用ActiveSupport提供的the in_groups
monkey-patch,如另一个答案所述:
require 'active_support/core_ext/array/grouping'
my_array = [1,2,3,4,5]
my_array.in_groups(2)
# => [[1, 2, 3], [4, 5, nil]]
my_array.in_groups(2, false)
# => [[1, 2, 3], [4, 5]]
如果您关心组中的元素数而不是组数,则可以使用Ruby core提供的each_slice
:
my_array = [1,2,3,4,5]
my_array.each_slice(2).to_a
# => [[1, 2], [3, 4], [5]]
答案 4 :(得分:0)
如果x是组数:
{
"Sid": "Deny unencrypted upload (require --sse)",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::BUCKET_NAME/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
}
=> [[1、2、3、4、5、6],[7、8、9、10、11、12]]
如果按x个分组:
x = 2
a = [1,2,3,4,5,6,7,8,9,10,11,12]
a.in_groups(x)
=> [[1、2],[3、4],[5、6],[7、8],[9、10],[11、12]]