メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー
Bidirectional mapのプロトタイプをScalaだけで作ってみた。
最終更新日: Mon Feb 21 06:24:13 2022 +0900
はじめに
やんごとなき作業のすきま作業(*1,後述します。)でScalaでプログラムを書いていたのですが、
「bidirectional mapが必要かも。」
と思ったので書いてみたところ、当初の想定よりもシンプルに書けました。
スポンサーリンク
本編
プログラム
プログラムはテストコードなど込みで、GitHubに置きました。
ネーミング
BidirectionalなMapでMutableなMapを拡張して作ったものなので、パッケージ名及びクラス名は「BiMMap」としました。
そのまんまな感じのネーミングです。
作り方
BiMMapはクラスはscala.collection.mutable.Mapを拡張して作りますが、traitを拡張するので、インスタンスを別途定義する必要があります。
そこで、publicとするMapの子クラスとしてHelperクラス(BiMMap_クラス)を定義し、HelperクラスにMutableなMapのコンストラクタを引数として渡しています。
「Mapはtraitのはずなのになんでコンストラクタが実行できるのか?」というツッコミがあるかもしれませんが、Mapの親traitのコンパニオンオブジェクト(MapFactory)には子クラス(Delegate)がいて、そこにはapplyメソッドが待ち構えています。このメソッドがコンストラクタを実行すると起動されるようです。
スポンサーリンク
使用例
当面の間はテストコードをご参照ください。
プログラミング後記
BiMMapは本来予定していたすきま作業(*1)では使用されない見込みです。
そうは言ってもコード的にはいい感じのものが作れたので、参照用としてGitHubに置くことにしました。
Scalaのソースコードを紐解いてみると、Map.scalaにAbstractMapなるクラスがいて、それを拡張するとGitHubに置いたコードと似たようなことができそうにも見えましたが、iteratorを定義するための実装のハードルが高かったため、AbstractMapクラスを拡張する方から攻めるアプローチは断念しました。
value側からのkeyの検索時にkeyとvalueを転置したMapを作っているため、データ量が多くなってくると処理コストがデータ量に比例して増えるかもなので、時々value側からの検索を行いたい時にしか役に立たないかもしれませんが、何かの機会のご参考にしていただけると幸いです。
リンク
メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー
スポンサーリンク