スポンサーサイト

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

F#入門編落穂拾い その5 (Map)

今回はMapを紹介します。
これはDictionaryと同じく、キーと値をセットにして登録していく値の容器で、通常キーを指定してすばやくそれに対応する値を取り出すのに使います。
 
まずは作成から
 
> let t = Map.empty;;
val t : Map<'a,'b>
 
で空のMapが作成されます。
 
あとキーとアイテムをペアにして登録していきますが、関数型のプログラミングスタイルでは、どんどん束縛していく必要があります。
 
> let t1 = Map.add "abc" 5 t;; //この場合はキーがstring、アイテムがint
val t1 : Map<string,int>
 
> t1;;
val it : Map<string,int> = seq [[abc, 5] {Key = "abc"; Value = 5;}]
 
> let t2 = Map.add "dke" 890 t1;;
val t2 : Map<string,int>
 
> t2;;
val it : Map<string,int> =  seq [[abc, 5] {Key = "abc"; Value = 5;}; [dke, 890] {Key = "dke"; Value = 890;}]

 

(参考)命令型プログラミングスタイルでは、たとえば次のようになります。
 
> let mutable t : Map<string,int>  = Map.empty;;
val mutable t : Map<string,int>
 
> t <- Map.add "abc" 5 t;;
val it : unit = ()
 
> t;;
val it : Map<string,int> = seq [[abc, 5] {Key = "abc";Value = 5;}]
 
 
Dictionaryと異なり同じKeyのものを付け加えると置き換えられた新しいMapが返ります。
 
> let t3  = Map.add "dke" 100000 t2;;
 
val t3 : Map<string,int>
 
> t3;;
val it : Map<string,int> =
  seq [[abc, 5] {Key = "abc";Value = 5;}; [dke, 100000] {Key = "dke"; Value = 100000;}]
 
次に連続追加です。例えば次のリストの内容をどんどん付け加えなくてはならないとします。
let lst = [("dec",789);("eff",452);("wsa",456)]
ここでは復習がてら、List.foldを利用した例を紹介しておきます。
 
let u = List.fold (fun s (k,it) -> Map.add k it s) t2 lst
 
また上のlstのような形のリストからは直接Map.of_listを用いてMapを作成することもできます。
 
let t0 = Map.of_list lst
 
あるkeyが登録されているか、いないかをしらべるのにはContainsKeyメソッドを使います。
 
> t0.ContainsKey "eff";;
val it : bool = true
 
次にキーからアイテムの検索方法です。
 
> t2.["dke"];;
val it : int = 890 //ちゃんとt2は不変なまま残ってます。
 
> t3.["dke"];;
val it : int = 100000
 
Itemメソッドでも同様のことができます。(このあたりはDictionaryと同じです。)
 
> t2.Item "dke";;
val it : int = 890
 
登録されているか、されていないか分からない場合は例えばTryFindメソッドを使います。
 
> t2.TryFind "dee";;
val it : int option = None
 
> t2.TryFind "dke";;
val it : int option = Some 890
 
Dictionaryと異なりこちらはオプション型で返ってきます。
 
今後の説明のために一度t2を表示しておきます。
 
> t2;;
val it : Map<string,int> =
  seq [[abc, 5] {Key = "abc";Value = 5;}; [dke, 890] {Key = "dke";Value = 890;}]
   
取り除くにはRemoveメソッドを使います。 
 
> let t4 =t2.Remove "dee";;
val t4 : Map<string,int>
> t4;;
val it : Map<string,int> =
  seq [[abc, 5] {Key = "abc"; Value = 5;}; [dke, 890] {Key = "dke"; Value = 890;}]
上のように存在しないkeyのものを取り除こうとしてもエラーはおきません。
 
> let t4 =t2.Remove "abc";;
val t4 : Map<string,int>
 
> t4;;
val it : Map<string,int> = seq [[dke, 890] {Key = "dke";Value = 890;}]
 
要素の個数はCountプロパティで調べることができます。
 
> t2.Count;;
val it : int = 2
 
Map内にあるKeyやItemの一覧が欲しい場合は、リスト化などをすればよいかと思います。

スポンサーサイト

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

コメントの投稿

非公開コメント

No title

とてもすてきなブログですね☆
この度、新規に逆アクセスランキングサイトを立ち上げました。
ブログを拝見させていただき、内容もよく、大変よくできているブログであると感じました。
このブログを「逆アクセスランキング」に登録して、もっと多くの人に読んでもらいませんか?
ランキングが上位に上がると多くのアクセスとSEO効果が期待できます。
宜しくお願い致します。

逆アクセスランキング
http://tenshoku-ex.jp/access_ranking

よろしければ以下のランキングにもご参加ください。
http://ranking.kuruma-ex.jp/
http://ranking.chintai-ex.jp/

参加をお待ちしています☆

No title

>例えばTryGetValueメソッドを使います。
例示されているのは、TryFind

No title

>どんどん束縛していく必要があります

mutable にしておくという方法も・

No title

ご意見参考にしていただき、mutableの場合をつけたしました。TryFindの部分も修正しました。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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