2014-10-29 4 views
0

이름 배열을 2D 배열로 푸시하려고합니다. 2D 배열이 4 개의 항목에 도달하면 배열의 다음 위치에 추가합니다. 예를 들면 다음과 같습니다.2D 배열로 푸시

groups[0] 
[ 
    [0] "bobby", 
    [1] "tommy", 
    [2] "johnny", 
    [3] "brian" 
] 

groups[1] 
    [0] "christina", 
    [1] "alex", 
    [2] "larry", 
    [3] "john" 
] 

다음은 어떻게 작동합니까? 작동하지 않습니다. 아마 자동으로이 프로세스를 수행 할 루비 함수가 내장되어있을 것입니다. 그러나 수동으로 먼저 쓰려고합니다 :

def make_group(the_cohort) 
    y=0 
    x=1 
    groups=[] 

    the_cohort.each do |student| 
     groups[y].push student 
     x+=1 
     y+=1 && x=1 if x==4 
    end 
end 

미리 감사드립니다. 되는 각 학생이 groups의 마지막 항목을 살펴 보겠습니다 들어

groups = [[]] 
the_cohort.each do |student| 
    groups.push [] if groups.last.length == 4 
    groups.last.push student 
end 

(: 코드에서

1. If the last array in groups has 4 entries, add another array to groups 
2. Push the entry into the last array in groups 

: 루비 2.1.1p73를

+0

, 루비는 그 (당신이 계산되지 않는'Matrix')를 가지고 있지 않습니다. 그것은 단지 배열의 배열입니다. –

+0

@ChrisHeald에서 언급 한 열거 형 # each_slice가이 작업을 위해 특별히 제작되었지만 다른 방법이 있습니다. 여기에 하나 :'(0 ... arr.size) .step (4) .map {| i | arr [i, 4]}'. –

답변

3

알고리즘이 표현 될 수 로 사용 그 중 하나만 가능할 수있는 유일한 것임), groups에 새 하위 배열을 추가해야하는지 결정한 다음 학생을 마지막 하위 배열로 밀어 넣습니다.

즉, 실제로 원하는 이름이 4 가지 그룹으로 나뉘어져있는 것처럼 들리는 것 같습니다. 루비는이 each_slice를 통해 이미 내장되어 있습니다 :

2 차원 배열이 아니다
the_cohort = %w(bobby tommy johnny brian christina alex larry john) 
the_cohort.each_slice(4).to_a 
# => [["bobby", "tommy", "johnny", "brian"], ["christina", "alex", "larry", "john"]] 
+0

감사합니다. groups = [[]]는 목록의 목록이 null이고 사용자가 누를 수 없기 때문에해야 할 일입니다. each_slice에 대해 알고 있었지만 내장 함수를 사용하기 전에 '수동으로'문제를 해결하기를 원했습니다. 시간을내어 두 가지를 설명해 주셔서 감사합니다! – theartofbeing