3

これは、英数字の小文字でソートされた出力を取得するためにRubyハッシュの値を処理する方法です(極端な例)。

myhash = {
  "x" => "zebra",
  "one" => "1",
  "alpeh" => "alpha",
  "lower" => "january",
  "1" => "January",
  "2" => "February",
  "answer" => "42"
}
m = myhash.values
puts m.map{|i| i.downcase}.sort

出力:

1
42
alpha
february
january
january
zebra

これは問題なく動作し、問題はありませんが、私が見逃しているより簡単で効率的な方法があるかどうか知りたいですか?

4

3 に答える 3

7

値を変更したい(小文字の文字列を出力する)ので、これ以上のことはできないと思います。

適切にソートされている限り、元の値を出力しても問題ない場合は、次のように使用できます。

 myhash.values.sort_by{|h|h.downcase}

編集:キャスパーのおかげで、これはよりコンパクトなバージョンです:

myhash.values.sort_by(&:downcase)

編集:提供した出力を保持したい場合は、ミシャに感謝します:

myhash.values.map(&:downcase).sort
于 2012-08-09T15:31:25.567 に答える
3

hash.values を使用するよりも効率的な方法 (一時配列を作成し、ハッシュが大きい場合は時間とスペースを消費する可能性があるため)

myhash.sort_by{|_,v| v.downcase}
于 2012-08-09T16:06:51.503 に答える
1

こっちの方が効率いいかも…

m.sort {|a, b| a.casecmp(b)}

=> ["1", "42", "アルファ", "2月", "1月", "1月", "シマウマ"]

入力の大文字と小文字を無視するテスト関数を使用するだけです。出力配列に重複した値を含めるかどうかによって異なります (例: 1 月/1 月と 1 月/1 月)。

于 2012-08-09T17:22:09.690 に答える