programing

키별로 해시 정렬, Ruby에서 해시 반환

javajsp 2023. 6. 3. 08:16

키별로 해시 정렬, Ruby에서 해시 반환

해시를 정렬하고 해시 개체를 반환하는 가장 좋은 방법은 다음과 같습니다(Array 대신).

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튜플 배열에서 그것들을 a로 변환하는 방법.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 Hash를 숫자 값으로 정렬하는 방법"에도 유사한 질문이 있습니다.

키별로 해시 정렬, Ruby에서 해시 반환

destructuring 및 Hash#sort

hash.sort { |(ak, _), (bk, _)| ak <=> bk }.to_h

열거 가능한 #sort_by

hash.sort_by { |k, v| k }.to_h

기본 동작을 포함하는 해시 #sort

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 }

참고: < 루비 2.1

array = [["key", "value"]] 
hash  = Hash[array]
hash #=> {"key"=>"value"}

참고 : > 루비 2.1

[["key", "value"]].to_h #=> {"key"=>"value"}

당신은 OP에서 자신에게 최고의 답변을 했습니다.Hash[h.sort]더 많은 가능성이 필요한 경우 정렬되도록 원래 해시를 인플레이스 수정합니다.

h.keys.sort.each { |k| h[k] = h.delete k }

아니요, 그렇지 않습니다(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배 이상 증가합니다.

활성 지원:Ruby 1.9.2를 사용하거나 사용자만의 해결 방법을 롤오버하지 않으려면 OrderedHash도 선택할 수 있습니다.

사용할 수 있습니다.sort메소드를 사용하여 어레이를 다시 해시로 변환합니다.to_h방법

h = { "a" => 1, "c" => 3, "b" => 2, "d" => 4 }
h.sort.to_h
# => { "a" => 1, "b" => 2, "c" => 3, "d" => 4 }
@ordered = {}
@unordered.keys.sort.each do |key|
  @ordered[key] = @unordered[key]
end

저도 같은 문제가 있었습니다(장비를 이름별로 분류해야 했습니다). 그리고 저는 다음과 같이 해결했습니다.

<% @equipments.sort.each do |name, quantity| %>
...
<% end %>

@장비는 모델에서 구축하고 컨트롤러에서 반환하는 해시입니다..sort를 호출하면 키 값을 기준으로 해시가 정렬됩니다.

나는 인플레이스 패치를 위한 Boris Stitnicky의 영감을 받은 솔루션을 빌렸습니다.sort!로의 방법.Hash:

def sort!
  keys.sort!.each { |k| store k, delete(k) }
  self
end

저는 이전 게시물의 해결책이 마음에 들었습니다.

나는 그것이라고 불리는 미니 클래스를 만들었습니다.class AlphabeticalHash그것은 또한 다음과 같은 방법을 가지고 있습니다.ap인수인 a 은것하받다니아입들주장을의나, a를 .Hash 입으로력:ap variablepp와한 것 (pp유 함사와(함사유▁akinpp와)pp variable)

하지만 그것은 알파벳 목록(키)으로 인쇄할 것입니다.이 이것을할 수 있습니다. 설치할 수 . 다음과 같이 설치할 수 있습니다.gem install alphabetical_hash

저에게는, 이것은 충분히 간단합니다.다른 사용자들이 더 많은 기능을 필요로 한다면, 제가 보석에 포함시키겠습니다.

편집: 제게 아이디어를 주신 피터에게 공로가 있습니다.:)

언급URL : https://stackoverflow.com/questions/4339553/sort-hash-by-key-return-hash-in-ruby