[#40890] windowsでコンテキストメニューの「印刷」を実行するには? — 岩崎 弘孝 <IH000667@...>
岩崎と申します。
7 messages
2005/07/01
[#40891] 配列をシャッフル — Hideo Konami <konami@...>
小波です。
25 messages
2005/07/01
[#40892] Re: 配列をシャッフル
— Hiroyuki Adachi <hiroyuki-a@...>
2005/07/01
array = [1, 2, 3, 4, 5]
[#40899] Re: 配列をシャッフル
— ktokita <ktokita-p@...>
2005/07/01
時田です
[#40904] slice の仕様とマニュアルの記述 — Hideo Konami <konami@...>
小波です。
6 messages
2005/07/02
[#40939] 値の集合内の中から値の大きな数個のみを取得するには? — 岩崎 弘孝 <IH000667@...>
岩崎と申します。
5 messages
2005/07/27
[#40941] オブジェクト配列の単一化は? — 小西 弘将 <konishi@...>
小西です。いつもお世話になります。
6 messages
2005/07/27
[#40955] irb --noreadline — Masatoshi SEKI <m_seki@...>
咳といいます。
10 messages
2005/07/29
[#40966] Solaris9上のREXML — Hirotaka Mizutani <hirotaka@...>
初めて投稿させて頂きます。水谷と申します。
6 messages
2005/07/29
[ruby-list:40947] Re: オブジェクト配列の単一化は?
From:
小西 弘将 <konishi@...>
Date:
2005-07-28 02:24:55 UTC
List:
ruby-list #40947
小西 弘将です。 >>eql?の再定義がうまくいっていないのでしょうか? > >eql? を再定義した場合は、hash も再定義する必要があります。 > >http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Object#eql.3f > >というわけで、こんな感じでしょうか。 > >class Hoge > def initialize( n ) > @name = n > end > def eql?( otr ) > @name.eql?( otr.name ) > end > def hash # a.eql?(b) が成り立つときは a.hash == b.hash でないといけない > @name.hash # なので、 @name.hash + 1039 なんてものでも OK ? > end > attr_accessor :name >end > >dat = [ Hoge.new( "hoge" ), > Hoge.new( "hage" ), > Hoge.new( "boke" ), > Hoge.new( "hage" ), > Hoge.new( "boke" ) ] >dat.uniq! > >dat.each do |d| > print d.name,"\n" >end なるほど、うまくいきました。ありがとうございます。 今回はString#hashでうまくいきましたが、この仕様だとHash値の衝突がないよ うに自分でうまく設計しなければならないケースが出てきそうです(レアだとは 思いますが)。 また、2重配列の場合の単一化もきれいにかけそうにないです。 dat = [[0,0,0],[1,1,1],[2,2,2],[1,1,1]] dat.uniq! みたいに書けない上、Array#hash、Array#eql?をこのときだけ変えるというのも スレッドとか考えるとよくないように思えます。 最初uniqもsortやdelete_atと同じ毛色のものと思っていたので、下のように評 価関数をブロック渡しすることでできないかなぁと思ったりもしました。 dat = [[0,0,0],[1,1,1],[2,2,2],[1,1,1]] dat.uniq! do |lhs,rhs| return false if lhs.size != rhs.size for i in (0...lhs.size) return false if lhs[i] != rhs[i] end true end #もちろんサイズが大きくなると遅くなるでしょうが