ブロックが渡されたときのArray#sortの動作はどうなっていますか?
2023-07-25 14:42:22
質問
私は、どのように
array.sort{ |x,y| block }
が正確にどのように機能するのか、したがって、どのようにそれを使用するのでしょうか?
の例です。 Rubyのドキュメント :
a = [ "d", "a", "e", "c", "b" ]
a.sort #=> ["a", "b", "c", "d", "e"]
a.sort { |x,y| y <=> x } #=> ["e", "d", "c", "b", "a"]
どのように解決するのですか?
あなたの例では
a.sort
は
a.sort { |x, y| x <=> y }
ご存知のように、配列をソートするためには、その要素を比較する必要があります(もし疑うのであれば、比較を使用せずに任意のソートアルゴリズムを実装してみてください、いいえ
<
,
>
,
<=
または
>=
).
あなたが提供するブロックは、実際には
sort
アルゴリズムによって呼び出される関数です。
つまり
x
と
y
によって選ばれた入力配列の要素になります。
sort
アルゴリズムによって選ばれた入力配列の要素です。
は
sort
アルゴリズムは、この比較関数/ブロックがメソッドの要件を満たすと仮定します。
<=>
:
- x < y の場合は -1 を返す。
- x = y ならば 0 を返す
- x > yなら1を返す
適切な比較関数やブロックを用意しないと、配列の順序が不定になります。
これで、なぜ
a.sort { |x, y| x <=> y }
と
a.sort { |x, y| y <=> x }
は同じ配列を逆の順序で返します。
Tate Johnsonが追加した内容を詳しく説明すると、比較関数を実装すると
<=>
を実装すると、次のようになります。
-
モジュールをインクルードすることができます。
Comparable
をインクルードすると、以下のメソッドが自動的に定義されます。between?
,==
,>=
,<
,<=
と>
. -
クラスのインスタンスは、デフォルト(つまり引数なし)の
sort
.
なお
<=>
メソッドは、ruby の標準ライブラリで意味のあるものであればどこでもすでに提供されていることに注意してください (
Bignum
,
Array
,
File::Stat
,
Fixnum
,
String
,
Time
など...)。
関連
-
[解決済み] Twigでの出力配列
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] 多次元配列の値によるソート方法
-
[解決済み] 整数の配列を正しくソートする方法
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】配列に何かを追加する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MIPSで宣言された配列からの印刷
-
[解決済み] jsonに複数の値を1つのキーで格納する
-
[解決済み] Ruby: ハッシュの配列で Enumerator を取得しようとすると nil:NilClass の未定義メソッド `[]' が発生する。
-
[解決済み】GCC: 配列の型が不完全な要素型である
-
[解決済み】Rubyの<=>(スペースシップ)演算子って何?
-
[解決済み] Swiftの2次元配列
-
[解決済み] Kotlin - 配列に値が含まれていることを確認する慣用的な方法
-
[解決済み] bashでグローバルを使用せずに配列を返すには?
-
[解決済み] Postgresでjson配列を行に変換する方法
-
[解決済み] Swiftのクロージャで$0と$1は何を意味するのか?