키로 해시 정렬, 루비에서 해시 반환
이것이 해시를 정렬하고 배열 대신 해시 객체를 반환하는 가장 좋은 방법입니까?
h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
# => {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
Hash[h.sort]
# => {"a"=>1, "b"=>2, "c"=>3, "d"=>4}
Ruby 2.1에서는 간단합니다 :
h.sort.to_h
참고 : Ruby> = 1.9.2에는 주문 보존 해시가 있습니다. 주문 키가 삽입 된 순서가 입력됩니다. 아래는 이전 버전 또는 이전 버전과 호환되는 코드에 적용됩니다.
정렬 된 해시 개념이 없습니다. 그래서, 당신이하고있는 일은 옳지 않습니다.
표시를 위해 정렬하려면 문자열을 반환하십시오.
"{" + h.sort.map{|k,v| "#{k.inspect}=>#{v.inspect}"}.join(", ") + "}"
또는 키를 순서대로 원할 경우 :
h.keys.sort
또는 순서대로 요소에 액세스하려는 경우 :
h.sort.map do |key,value|
# keys will arrive in order to this block, with their associated value.
end
그러나 요약하면 정렬 된 해시에 대해 이야기하는 것은 의미가 없습니다. 로부터 문서 , "당신도 키 또는 값으로 해시를 통과하는 순서는 임의 보일 수 있으며, 일반적으로 삽입 순서가 맞지 않습니다." 따라서 해시에 특정 순서로 키를 삽입해도 도움이되지 않습니다.
나는 항상 사용했습니다 sort_by
. #sort_by
출력 을 랩핑하여 Hash[]
해시를 출력하도록해야합니다. 그렇지 않으면 배열의 배열을 출력합니다. 또는이를 수행 #to_h
하기 위해 튜플 배열 에서 메소드를 실행하여 k=>v
구조 (해시) 로 변환 할 수 있습니다 .
hsh ={"a" => 1000, "b" => 10, "c" => 200000}
Hash[hsh.sort_by{|k,v| v}] #or hsh.sort_by{|k,v| v}.to_h
" 숫자 값으로 루비 해시를 정렬하는 방법? " 과 비슷한 질문이 있습니다 .
아니요, 아닙니다 (Ruby 1.9.x)
require 'benchmark'
h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
many = 100_000
Benchmark.bm do |b|
GC.start
b.report("hash sort") do
many.times do
Hash[h.sort]
end
end
GC.start
b.report("keys sort") do
many.times do
nh = {}
h.keys.sort.each do |k|
nh[k] = h[k]
end
end
end
end
user system total real
hash sort 0.400000 0.000000 0.400000 ( 0.405588)
keys sort 0.250000 0.010000 0.260000 ( 0.260303)
큰 해시의 경우 차이가 10 배 이상 증가합니다.
OP에서 자신에게 가장 좋은 대답을 Hash[h.sort]
했습니다. 더 많은 가능성을 원한다면 원래 해시를 적절하게 수정하여 정렬하십시오.
h.keys.sort.each { |k| h[k] = h.delete k }
루비 1.9.2를 사용하거나 자체 해결 방법을 롤링하지 않으려는 경우 ActiveSupport :: OrderedHash 가 또 다른 옵션입니다.
키로 해시 정렬 , 루비에서 해시 반환
와 destructuring 및 해시 번호 종류
hash.sort { |(ak, _), (bk, _)| ak <=> bk }.to_h
열거 가능
hash.sort_by { |k, v| k }.to_h
기본 동작으로 해시 # 정렬
h = { "b" => 2, "c" => 1, "a" => 3 }
h.sort # e.g. ["a", 20] <=> ["b", 30]
hash.sort.to_h #=> { "a" => 3, "b" => 2, "c" => 1 }
참고 : <Ruby 2.1
array = [["key", "value"]]
hash = Hash[array]
hash #=> {"key"=>"value"}
참고 :> Ruby 2.1
[["key", "value"]].to_h #=> {"key"=>"value"}
@ordered = {}
@unordered.keys.sort.each do |key|
@ordered[key] = @unordered[key]
end
나는 같은 문제가 있었고 (장비 이름으로 장비를 정렬해야 했음) 다음과 같이 해결했습니다.
<% @equipments.sort.each do |name, quantity| %>
...
<% end %>
@equipments는 모델에서 빌드하고 컨트롤러에서 반환하는 해시입니다. .sort를 호출하면 키 값을 기준으로 해시가 정렬됩니다.
이전 게시물의 솔루션이 마음에 들었습니다.
나는 미니 클래스를 만들었습니다 class AlphabeticalHash
. 또한 ap
하나의 인수 a Hash
를 입력으로 허용 하는이라는 메소드가 ap variable
있습니다. PP와 비슷 함 ( pp variable
)
그러나 그것은 알파벳 목록 (키)으로 (시도하고) 인쇄합니다. Dunno 다른 사람이 이것을 사용하려면 보석으로 사용할 수 있으며 다음과 같이 설치할 수 있습니다.gem install alphabetical_hash
나에게 이것은 간단하다. 다른 사람들이 더 많은 기능이 필요하면 알려주십시오. 보석에 포함시킬 것입니다.
편집 : 크레딧은 Peter 에게 갔다. :)
참고 URL : https://stackoverflow.com/questions/4339553/sort-hash-by-key-return-hash-in-ruby
'IT story' 카테고리의 다른 글
Chrome devtools의 교차 스타일 속성은 무엇을 의미합니까? (0) | 2020.04.06 |
---|---|
Java에서 유효한 @SuppressWarnings 경고 이름 목록은 무엇입니까? (0) | 2020.04.06 |
엔티티 프레임 워크 코드 첫 번째-동일한 테이블에서 두 개의 외래 키 (0) | 2020.04.06 |
포인터 대 참조 (0) | 2020.04.06 |
ReactiveCocoa vs RxSwift-장단점? (0) | 2020.04.06 |