質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

2回答

998閲覧

Ruby GDBMに保存されているデータの一番上の値を出力

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/08/24 02:16

次のようなCSVファイルをTimeをキーとしてGDBMで読み込める形式に書き換えています。

No,Time,kakaku,kosuu
1,20180821,100,35
2,20180822,300,11
3,20180823,150,16
4,20180824,200,13

その後、GDBMでキー(Time)をもとに”kakaku”や”kosuu”は出力はできるですが、
キーがわからない時に、GDBMの一番上のデータのキーを出力するにはどうしたら良いでしょうか?

例えば、GDBMのファイルを”20180822”で検索したら、”2,20180822,300,11”が出力されいますが、
検索をしないで[0]等を指定して、DBMのファイルの一番上のキー(20180821)または、”1,20180821,100,35”を出力したいです。

何か解決方法がありましたら教えて頂けると助かります。
宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

eachやeach_keyおよびeach_valueとlazy.mapを利用して

ruby

1GDBM.open "hoge" do |db| 2 # 最初のkeyを取得 3 first_key = db.each_key.lazy.map(&:itself).first 4 p first_key 5 6 # n = 3番目のkeyを取得 7 n = 3 8 nth_key = db.each_key.lazy.drop(n-1).map(&:itself).first 9 p nth_key 10 11 # 取り出して削除してしまう場合は 12 first_key, first_val = db.shift 13 p first_key 14end

投稿2018/08/24 17:29

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

keysを得てソートするくらいしか無いと思います。

#追記
最小のキーを保持するとすると、GDBMのサブクラスを作ってそこで、キーの最小値をチェックして、保持する。

Ruby

1class MyGDBM < GDBM 2 def []=(key,val) 3 super 4 if not @lowest_key or @lowest_key > key 5 @lowest_key = key 6 end 7 end 8 attr_reader :lowest_key 9end 10 11MyGDBM.open("/tmp/sample.db") do |db| 12 db["a"]="1" 13 db["A"]="1" 14 db["0"]="1" 15 p db.keys 16 p db.lowest_key 17end

[]=以外のメソッドでキーを追加する事があるのであれば、それも同様に。
要素が削除される場合があると面倒ですね。

最小キーをプログラムの実行を越えて永続化したいのであれば、@lowest_keyself["0"]にでも保持すれば良い。

Ruby

1 if not @lowest_key or @lowest_key > key 2 @lowest_key = key 3 super("0",@lowest_ley) # self["0"]=@lowest_keyはだめ 4 end

投稿2018/08/24 03:50

編集2018/08/24 22:15
otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/24 03:57

ありがとうございます。 Keysだと一旦すべてのキーを読み込むので時間がかかってしまうのです。 何か別の方法があれば良いのですが…
otn

2018/08/24 04:06

最小のキーが必要なのであれば、キー追加の時に毎回確認して、最小キー変数にセットするとか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問