スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門編落穂拾い その4 (Dictionary)

今回はDictionaryを紹介します。
これは、キーと値をセットにして登録していく値の容器で、通常キーを指定してすばやくそれに対応する値を取り出すのに使います。
こちらは命令型プログラミング向けの容器です。関数型プログラミング向けにはMapがあります。
また使うためには
open System.Collections.Generic
としておく必要があります。
 
まずは作成から、
 
> let d = new Dictionary<int,string> ();;
val d : Dictionary<int,string> = dict []
 
これで、int型の値をキー(Key)に対し、string型の値(こちらをItemとか言います)がそれに対応するようなDictionaryが作成されました。後はこのインスタンスdに対する操作となります。
 
つぎに、要素の追加です。keyとItemをペアにしてaddで追加します
 
> d.Add(3,"ek");;
val it : unit = ()
 
> d.Add(7,"uy");;
val it : unit = ()
 
あるkeyが登録されているか、いないかをしらべるのにはContainsKeyメソッドを使います。
 
> d.ContainsKey 3;;
val it : bool = true
 
> d.ContainsKey 5;;
val it : bool = false
 
あるItemが登録されているか、いないかをしらべるのにはContainsValueメソッドを使います。
 
> d.ContainsValue "uy";;
val it : bool = true
 
 
同じkeyのものを2重に登録しようとすると例外が発生します。
 
> d.Add(3,"tttttt");;
System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   以下略          
 
key 3に対応するItemを取り出してみます。
 
> d.[3];;
val it : string = "ek"
 
このように「インスタンス名.[key]」で、keyに対応するItemの値を得ることができます。
 
登録されていないkeyを指定すると例外が発生します。
> d.[5];;
System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary...以下略
 
また、Itemメソッドでも同様のことができます。
 
> d.Item 7;;
val it : string = "uy"
 
登録されているか、されていないか分からない場合は例えばTryGetValueメソッドを使います。
 
> d.TryGetValue 3;;
val it : bool * string = (true, "ek")
 
> d.TryGetValue 5;;
val it : bool * string = (false, null)
 
取り除くにはRemoveメソッドを使います。
 
> d.Remove 3;;
val it : bool = true
 
これで、key 3とそれに対応するItemが取り除かれました。
返り値のtrueは取り除きの成功を表します。
 
> d.Remove 5;;
val it : bool = false
 
keyが5のものは存在しないので、これは失敗でfalseが返ってきました。
 
ここで、二つほどkeyとItemの組を追加しておきます。
 
> d.Add (8,"yyy");;
val it : unit = ()
> d.Add (-1,"tru");;
val it : unit = ()
 
辞書内にあるkeyの一覧を取り出すにはKeysプロパティを利用します。
 
> d.Keys ;;
val it : Dictionary`2.KeyCollection<int,string> = seq [8; 7; -1]
 
辞書内にあるItemの一覧を取り出すにはValuesプロパティを利用します。
 
> d.Values ;;
val it : Dictionary`2.ValueCollection<int,string> = seq ["yyy"; "uy"; "tru"]
 
 
keyとItemのペアの一覧が必要なら例えば次のようすればできます。
 
> let t = Seq.zip d.Keys d.Values;;
val t : seq<int * string>
 
> t;;
val it : seq<int * string> = seq [(8, "yyy"); (7, "uy"); (-1, "tru")]
 
要素の個数はCountプロパティで調べることができます。
 
> d.Count;;
val it : int = 3
 
クリアするにはClearメソッドを使います。
 
> d.Clear();;
val it : unit = ()
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

No title

(単に個人的な趣味の問題なのかも知れませんが)
DictionaryもMap も連想配列的なものという面で同じというくくりなんでしょうけど、
>mutableです。(これのimmutable版がMapです。)
は、どうでしょうか
(.NET のオブジェクトをいじっているからオブジェクトの中身を変更できるってことに過ぎないような、それに、)
Map は、MapTree を基礎として構成されており、(動作としては似ていても)インターフェースも異なるものです。
どちらかというと、
dict [(3,"ek");(7,"uy")]
として作成したものがReadOnly (Addという操作ができないという意味で)という気がします。

No title

>Dictinarytを紹介します
Dictionary

>let t = Seq.zip d.Keys d.Values;;
好きずきかもしれませんが、
キーとバリューの列を作り出し合成しなくても
IEnumerable インターフェースを継承しているので、
GetEnumerator から 列挙することもできますし、
let t = seq { for x in d -> x.Key, x.Value }
のようにすることもできます。

No title

「こちらは命令型プログラミング向けの容器です。関数型プログラミング向けにはMapがあります。」
というように変えてみました。取り扱いに関しては、ListとArray(or ResizeArray)の関係に似ているかと。
ところでBLUEPIXYさん、私はBLUEPIXY覆面算のブログに触発されて、覆面算のコードを書いてみたのですが、トラックバックしてみてもよろしいでしょうか。(実はトラックバックなるものを、まだしたことがなかったりする。)

No title

>IEnumerable インターフェースを継承しているので、
GetEnumerator から 列挙することもできますし..

なるほど、もっと実装しているインターフェースの観点から、どんなことができるかを勉強する必要がありますね。

トラックバック

いちいち許可を得たりしなくても全然OKです。

まだ、t が・・

Dictionaryt

No title

すいません、何度も見直したのですが、私の頭の中では、tと「を」を一緒に認識していたみたいです。訂正しました。
プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。