2012-03-05 2 views
2

내 목표는 B로 변환하는 것이다재정렬 루비 어레이는 각각의 중첩 배열의 첫 번째 요소에 기초

a = [["a","b"], ["d", "c"], ["a", "o"], ["d", "g"], ["c", "a"]] 
b = [[["a","b"], ["a", "o"]], ["c", "a"], [["d", "c"], ["d", "g"]] 

그들은 서로 중첩 배열의 첫 번째 요소로 그룹화된다. 뿐만 아니라이 잔인한 사람처럼 보인다

def letter_frequency(c) 
    d = Hash.new(0) 
    c.each do |v| 
    d[v] += 1 
    end 
    d.each do |k, v| 
    end 
    end 

def separate_arrays(arry) 
    arry2 = [] 
    arry3 = [] 
    big_arry = [] 
    y = 0 
while y < arry.length 
    arry2.push(arry[y][0]) 
    arry3.push(arry[y][1])   
    y += 1 
end 
    freq = letter_frequency(arry2) 
    front = arry.slice!(0..(freq["a"] - 1)) 
end 

separate_arrays(a) 

을,하지만 지금은 "A", 합법적 인 해시 열쇠가 될 것이다 마지막 부분이 작동하지 않도록 보장이 있습니다 : 지금까지 나는 있습니다. 어떤 도움을 주셔서 감사합니다.

답변

3

당신은 이런 식으로 뭔가를 시도 할 수 있습니다 : 나는 다음과 같은 방법을 사용

a.group_by(&:first).values.map {|e| e.length > 1 ? e : e.flatten} 
# => [[["a", "b"], ["a", "o"]], [["d", "c"], ["d", "g"]], ["c", "a"]] 

: (귀하의 질문에 같은 배열의 첫 번째 요소에 의해)

Enumerable#group_by을 :

블록에서 키가 평가되는 해시를 반환하고 값은 해당 키에 해당하는 열거 형의 요소 배열입니다.

Hash#values

:

는 HSH의 값으로 새로운 배열을 돌려줍니다. 해시 # 키를 참조하십시오.

Enumerable#map (필수 당신은 c 문자에 같은 하나의 경기가있을 때 중첩 된 배열을 얻을 싶지 않기 때문에) :

가 한 번 블록의 실행 결과로 새로운 배열을 돌려줍니다 열거 형의 모든 요소.

Enumerable#flatten

:

이 배열 재귀의 일차원 평탄화하는 새로운 배열을 반환. 즉, 배열 인 모든 요소에 대해 요소를 새 배열에 추출하십시오. 선택적 수준 인수 은 재귀 수준을 결정합니다.

+0

감사합니다. – EHNole

관련 문제