루비에서 배열을 같은 부분으로 나누기
이 질문에 이미 답변이 있습니다.
- Ruby 2 답변 에서 배열을 청크하는 방법
동일한 크기의 다른 배열 내에서 배열을 여러 배열로 분할하는 방법이 필요합니다. 누구든지 이것을 할 방법이 있습니까?
예를 들어
a = [0, 1, 2, 3, 4, 5, 6, 7]
a.method_i_need(3)
a.inspect
=> [[0,1,2], [3,4,5], [6,7]]
당신은 찾고 있습니다 Enumerable#each_slice
a = [0, 1, 2, 3, 4, 5, 6, 7]
a.each_slice(3) # => #<Enumerator: [0, 1, 2, 3, 4, 5, 6, 7]:each_slice(3)>
a.each_slice(3).to_a # => [[0, 1, 2], [3, 4, 5], [6, 7]]
아마도 다른 답변이 이미 받아 들여져 있기 때문에 질문을 잘못 읽었을 수도 있지만 각 그룹의 크기에 관계없이 배열을 3 개의 그룹으로 나누는 대신 3 개의 동일한 그룹으로 나누고 싶었습니다. 이전 답변은 그렇습니다. 그것이 당신이 찾고있는 것이라면 Rails (ActiveSupport)에는 in_groups 라는 메소드도 있습니다 .
a = [0,1,2,3,4,5,6]
a.in_groups(2) # => [[0,1,2,3],[4,5,6,nil]]
a.in_groups(3, false) # => [[0,1,2],[3,4], [5,6]]
루비에 해당하는 것은 없다고 생각하지만 다음과 같은 간단한 방법을 추가하면 대략 같은 결과를 얻을 수 있습니다.
class Array; def in_groups(num_groups)
return [] if num_groups == 0
slice_size = (self.size/Float(num_groups)).ceil
groups = self.each_slice(slice_size).to_a
end; end
a.in_groups(3) # => [[0,1,2], [3,4,5], [6]]
(보시다시피) 유일한 차이점은 모든 그룹에 "빈 공간"이 퍼지지 않는다는 것입니다. 마지막 그룹을 제외한 모든 그룹은 크기가 같고 마지막 그룹은 항상 나머지와 모든 "빈 공간"을 포함합니다.
업데이트 : @rimsky가 당연히 지적했듯이, 위의 방법은 항상 올바른 수의 그룹을 가져 오지는 않습니다 (때로는 끝에 여러 개의 "빈 그룹"을 생성하고 제외). 다음 은 요청 된 수의 그룹을 채우기 위해 추가 항목을 분산하는 ActiveSupport의 정의 에서 축소 된 업데이트 된 버전 입니다.
def in_groups(number)
group_size = size / number
leftovers = size % number
groups = []
start = 0
number.times do |index|
length = group_size + (leftovers > 0 && leftovers > index ? 1 : 0)
groups << slice(start, length)
start += length
end
groups
end
시험
a.in_groups_of(3,false)
그것은 당신의 일을 할 것입니다
mltsy가 썼 듯이 일 in_groups(n, false)
을해야합니다.
적절한 균형을 잡기 위해 작은 트릭을 추가하고 싶었습니다 my_array.in_group(my_array.size.quo(max_size).ceil, false)
.
다음은 그 트릭을 설명하는 예입니다.
a = (0..8).to_a
a.in_groups(4, false) => [[0, 1, 2], [3, 4], [5, 6], [7, 8]]
a.in_groups(a.size.quo(4).ceil, false) => [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
This needs some better cleverness to smear out the extra pieces, but it's a reasonable start.
def i_need(bits, r)
c = r.count
(1..bits - 1).map { |i| r.shift((c + i) * 1.0 / bits ) } + [r]
end
> i_need(2, [1, 3, 5, 7, 2, 4, 6, 8])
=> [[1, 3, 5, 7], [2, 4, 6, 8]]
> i_need(3, [1, 3, 5, 7, 2, 4, 6, 8])
=> [[1, 3, 5], [7, 2, 4], [6, 8]]
> i_need(5, [1, 3, 5, 7, 2, 4, 6, 8])
=> [[1, 3], [5, 7], [2, 4], [6], [8]]
ReferenceURL : https://stackoverflow.com/questions/12374645/splitting-an-array-into-equal-parts-in-ruby
'Programing' 카테고리의 다른 글
Kubernetes는 예기치 않은 배포 SchemaError를 만듭니다. (0) | 2021.01.09 |
---|---|
UIImage가있는 Swift 플레이 그라운드 (0) | 2021.01.09 |
Javascript의 배열에서 가장 작은 값을 얻습니까? (0) | 2021.01.09 |
Android를 사용하여 sqlite에서 행 수를 얻는 방법은 무엇입니까? (0) | 2021.01.09 |
iOS UILabel에서 굵은 글꼴 설정 (0) | 2021.01.09 |