해시의 값으로 해시 배열을 어떻게 정렬합니까?


120

이 Ruby 코드는 예상대로 작동하지 않습니다.

# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})

# sort
sort_me.sort_by { |k| k["value"]}

# same order as above!
puts sort_me

키 "값"으로 해시 배열을 정렬하려고하지만 정렬되지 않은 상태로 인쇄됩니다.

답변:


215

루비 sort는 제자리에서 정렬되지 않습니다. (아마도 파이썬 배경 지식이 있습니까?)

Ruby에는 sort!내부 정렬이 있지만 sort_byRuby 1.8에는 내부 변형이 없습니다 . 실제로 다음을 수행 할 수 있습니다.

sorted = sort_me.sort_by { |k| k["value"] }
puts sorted

Ruby 1.9 이상부터는 .sort_by!내부 정렬에 사용할 수 있습니다.

sort_me.sort_by! { |k| k["value"]}

28
실제로 Array#sort_by!Ruby 1.9.2의 새로운 기능입니다. 사용 가능한 오늘 내 필요로하는 모든 루비 버전 backports도 보석 :-)
마크 - 앙드레 Lafortune

안녕하세요, 내림차순으로 정렬하는 방법도 있나요? 내가 가고 싶어 수도 파악 3,2,1...
tekknolagi

2
당신이 그렇게 할 수 sort_by있지만, 사용 sort또는 sort!단순히 피연산자 플립 : a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
스테판 Kochen

1
또는 :puts sorted = sort_me.sort_by{ |k,v| v }
Zaz

9
@tekknolagi : 그냥 추가하십시오 .reverse.
Zaz

21

@shteef에 sort!따라 제안 된대로 변형으로 구현되었습니다 .

sort_me.sort! { |x, y| x["value"] <=> y["value"] }

7

Ruby에는 sort_by내부 변형 이 없지만 다음을 수행 할 수 있습니다.

sort_me = sort_me.sort_by { |k| k["value"] }

Array.sort_by! 1.9.2에서 추가되었습니다.


1
이 "Array.sort_by! was added in 1.9.2"대답은 나를 위해 일했습니다
web spider26

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.