2015-02-06 5 views
0

I가 배열 :루비 그룹화 요소

a = [1, 3, 1, 3, 2, 1, 2] 

내가 값으로 그룹 원하지만 그것을 인덱스를 저장, 그래서 결과는이 같은 모습이어야합니다

[[0, 2, 5], [1, 3], [4, 6]] 

또는 해시

{1=>[0, 2, 5], 3=>[1, 3], 2=>[4, 6]} 

이제는 꽤 못생긴 큰 코드를 사용하고 있습니다.

struc = Struct.new(:index, :value) 
array = array.map.with_index{ |v, i| struc.new(i, v) }.group_by {|s| s[1]}.map { |h| h[1].map { |e| e[0]}} 

`

답변

2

을 당신은 기본적으로 해시를 사용하는 경우 요소를 두 번 반복하지 않도록 값 :

a = [1, 3, 1, 3, 2, 1, 2] 

Hash.new { |h, k| h[k] = [] }.tap do |result| 
    a.each_with_index { |i, n| result[i] << n } 
end 
#=> { 1 => [0, 2, 5], 3 => [1, 3], 2 => [4, 6] } 
+1

양호 또는 'a.each_with_index.with_object (Hash.new {| h, k | h [k] = []}) {((e, i), h | h [e] << i}'. –

+0

감사합니다 @CarySwoveland : TIL'with_object'는 전에는 그 방법을 들여다 보지 않았습니다. – spickermann

+0

[Enumerator # with_index] (http://ruby-doc.org/core-2.1.5/Enumerator.html#method-i-with_index)를 사용할 수도 있습니다 : a.each_with_object (Hash.new {| h, k | h [k] = []}). with_index {| (e, h), i | h [e] << i}'. 블록 변수의 다른 순서를 주목하십시오. 경사면. –

2
a = [1, 3, 1, 3, 2, 1, 2] 
a.each_with_index.group_by(&:first).values.map { |h| h.map &:last } 

먼저 우리는 group_by의 값 (한 쌍의 first 값), 각 한 쌍의 인덱스 (last 요소)를 가지고 폼 [val, idx], ... (each_with_index)에 Enumerator을 얻는다.