Subscribed unsubscribe Subscribe Subscribe

Set

Ruby

キーと値が同じなので,こういうときはSetを使うといいんではないかと思いました.

require 'set'
def makehash(path)
  open(path, "r") {|f|
    f.inject(Set.new) {|r, i| r.add(i.chop) }
  }
rescue
  puts 'error ' + path.to_s
  exit
end

それと一つ目のファイルをハッシュにする必要はなくて,ただ読むだけでいいのではないかと思いました.

hash2 = makehash(ARGV[1])
hash2 = makehash(ARGV[2])
open(ARGV[0], "r") {|f|
  f.map {|line|
    # ここでhash2.include?(line.chop)してprintみたいな感じ
  }
}

メモ

  • リファレンスによるとRubyのSetはHashでできているらしい.
  • HaskellのSetは木なので検索がO(log n)だけど,Rubyはどうなってるの?
  • hash2.include?(..)の部分は面倒で省いたけど,綺麗に書くにはどうする? 短いからべたっと場合分けして書く? 名前,パッケージの有無を保存するオブジェクトを作って,そこに印字するメソッドを作ってmapする?