panda大学習帳外伝

マスクと不精髭。

メインページ | 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大学習帳 | 第三倉庫 | 用語集📒 | 本サイトについて | プライバシーポリシー


スポンサーリンク