development

숫자 값으로 루비 해시를 정렬하는 방법?

big-blog 2020. 6. 10. 07:50
반응형

숫자 값으로 루비 해시를 정렬하는 방법?


개수별로 정렬하려고하는 카운터 해시가 있습니다. 내가 겪고있는 문제는 기본 Hash.sort 함수가 숫자 크기가 아닌 문자열처럼 숫자를 정렬한다는 것입니다.

즉 해시 :

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }

이 코드를 실행 :

metrics.sort {|a1,a2| a2[1]<=>a1[1]}

정렬 된 배열을 반환합니다 :

[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]

745가 9보다 큰 경우에도 9가 목록에 먼저 나타납니다. 누가 가장 많은 수의 사람을 보여 주려고 할 때, 이것은 내 인생을 어렵게 만듭니다. :)

숫자 값 크기로 해시 (또는 배열)를 정렬하는 방법에 대한 아이디어가 있습니까?

도움을 주셔서 감사합니다.


당신이 종류의 문자열 값으로 ... 당신은 반대해야하지 것이기 때문에, 결과를 얻었는지 아무 생각이 a1a2당신의 예에서

어떤 경우에도 (Mladen에 따라) 가장 좋은 방법은 다음과 같습니다.

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
metrics.sort_by {|_key, value| value}
  # ==> [["siteb.com", 9], ["sitec.com", 10], ["sitea.com", 745]]

결과적으로 해시가 필요한 경우 to_h(Ruby 2.0 이상에서)

metrics.sort_by {|_key, value| value}.to_h
  # ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}

value는 마지막 항목이므로 다음을 수행 할 수 있습니다.

metrics.sort_by(&:last)

이미 대답했지만 여전히. 코드를 다음과 같이 변경하십시오.

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }

도중에 문자열로 변환되거나 변환되지 않으면 작업이 수행됩니다.


그것은 내가보고있는 행동이 아닙니다.

irb(main):001:0> metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" =>
 10 }
=> {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745}
irb(main):002:0> metrics.sort {|a1,a2| a2[1]<=>a1[1]}
=> [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]]

줄을 따라 어딘가에서 숫자가 문자열로 변환 될 수 있습니까? 게시하지 않은 코드가 더 있습니까?

참고 URL : https://stackoverflow.com/questions/2540435/how-to-sort-a-ruby-hash-by-number-value

반응형