Programing

루비에서 배열을 같은 부분으로 나누기

lottogame 2021. 1. 9. 09:17
반응형

루비에서 배열을 같은 부분으로 나누기


이 질문에 이미 답변이 있습니다.

동일한 크기의 다른 배열 내에서 배열을 여러 배열로 분할하는 방법이 필요합니다. 누구든지 이것을 할 방법이 있습니까?

예를 들어

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

반응형