From: Tadayoshi Funaba Date: 1998-06-26T22:37:12+09:00 Subject: [ruby-list:8546] Re: hash sort ふなばです。 nonzero? と Array#<=> は、永井さんが始められた議論のなかで、どちらも僕 が提案したものですが、僕が <=> のアイディアに辿りついたときに、これが 正解かな、と思ったので、自分が考えた nonzero? も亡きものになる、と思っ ていました。 しかしながら、意外にも nonzero? は生き残り、それどころか Array#<=> よ りも好んでつかわれているような気配気さえするわけです。これには少しおど ろいています。 当初は nonzero? はもういらない、と思っていましたが、今はそれなりに意味 もあるのだろうと考えなおして、ひとまず納得したことにしているのですが、 やはり Array#<=> を第一に考えたいと僕は思っています。 その理由は、以前 に議論したことなので繰り返しません。 趣味の問題もあるだろうし、nonzero? をつかったほうが速いこともあるかも しれないから、絶対にこれがイイとはいえないのですが、今回の例でも、 array.sort!{|a,b| (b[1] <=> a[1]).nonzero? or b[0] <=> a[0]} と array.sort!{|a,b| b.reverse <=> a.reverse} とでは大して速度に差がなさそうだし、後者のほうが判り易いように思います。 ところで、そもそも、今回の例は速度のことを考えても、やりかたがよろしく ないということもできるわけです。 array = array.collect{|x| x.reverse} array.sort! array.reverse! array = array.collect{|x| x.reverse} で、こんなかんじでもいいんじゃないかあと思うんですが。あとは、ほんの少 しでも Ruby の都合を考える気持があれば、もっともっと速くできる可能性は あるでしょう。 # しかし、この関連の話題って結構多いみたいだなあ。 --Tadayoshi Funaba