各言語におけるImmutable 2D配列(List)の表現
言語間でデータを共有するために2次元配列を使い回すことを考える。ただし利用先ではFunctional、Reactiveプログラミングで利用することを考え、Immutableな配列(List)へImportする。
Pythonで処理したStringをJava, Kotlin, Swiftで利用するケースを想定する。またFunctionalプログラミングやReactiveプログラミングで使いたいのでImmutableな「配列(Collection)」を目標とする。
念のため書いておくと関数とはy=f(x)の形で記述されxをあたえるとそれに対応するyが決まるような操作fである。ここで大切なことは与えたxがfの操作によって変更されないことである。
もし変更されてしまうと同じxを使っている操作f1,f2…fn間で不整合が生じてしまうのである。
だからFunctionalプログラミングではImmutableということを大切にするのである。
各言語におけるImmutable Collectionの現状
- Swift: 柔軟に対応できる
柔軟なだけに本当はどうすればベストなのか、Appleの公式ドキュメントなどを参照する必要があるだろう。 - Kotlin: ListなどのCollectionにImmutable、Mutableの区別がある
Javaのしがらみがない分、高度な機能が標準で使えるようになっている。
ただし作り込みがイマイチと感じることもある。 -
Java: Google Guavaという外部ライブラリーで対応
Googleが提供しているライブラリを使用してImmutableなListを実現して利用する。具体的方法はAndroidプロジェクトでGoogleのGuavaライブラリーを使う具体的方法に記した。
String配列(List)に対する一般論
今回はまず、一番多そうな、String配列から入る。
Pythonで次のような文字列をコンソール出力したとしよう。
'a0','b0','c0','d0','e0'
'a1','b1','c1','d1','e1'
目標は次のようなものを作ることである。
1. Swift:Immutableな二次元のArrayを用いる
let my2DStringArr = [["a0","b0","c0","d0","e0"],["a1","b1","c1","d1","e1"]]
- Kotlin:二次元のListを用いる
val my2DStringList = listOf(listOf<String>("a0","b0","c0","d0","e0"),
listOf<String>("a1","b1","c1","d1","e1"))
- Java:これについてはGoogleのGuavaを使う。ImmutableList
と言うものがある。
ImmutableList<ImmutableList<String>> stringImmutableList2D =
ImmutableList.of(ImmutableList.of("a0","b0","c0","d0","e0"),
ImmutableList.of("a1","b1","c1","d1","e1"));
sedで変換する
まずPythonでのStirng配列をinput.txtとして保存する。上記の中身を詰めるためにsedを使って各言語用に変換する。各言語で中身を詰める前の段階まで用意しておく。つまり空の2次元配列変数などを用意しておくのである。
それからの具体的な流れとsedコマンド(括弧内)は以下の通り
- Swiftの二次元Arrayへ
- シングルクォーテーションをダブルクオーテーションへ (-e “s/\’/\”/g”)
- 一行を[],で囲む (-e ‘s/^”/[“/g’ -e ‘s/”$/”],/g’)
- 最終行の,を削除し全体を[]で囲む(手動)
- それを代入の右辺へ貼り付ける。(手動)
1.と2.のsedコマンドは-eオプションで連続させると
sed -e "s/\'/\"/g" -e 's/^"/["/g' -e 's/"$/"],/g' input.txt > outputSwift.txt
outputSwift.txtをテキストエディタで開き、最後の,を除いて対象の[]内へペーストする。
- Kotlinの二次元Listへ
- シングルクォーテーションをダブルクオーテーションへ (-e “s/\’/\”/g”)
- 一行をistOf
(),で囲む (-e ‘s/^”/listOf (“/g’ -e ‘s/”$/”),/g’) - 最終行の,を削除し全体をlistOf()で囲む(手動)
- それを代入の右辺へ貼り付ける。(手動)
Swiftの時と同様に
sed -e "s/\'/\"/g" -e 's/^"/listOf<String>("/g' -e 's/"$/"),/g' input.txt > outputKotlin.txt
また同様にしてoutputKotlin.txtからlistOf()の中にペーストする。
- JavaのImmutableなListへ
流れはKotlinの時と同様なのでコマンドのみ書く
sed -e "s/\'/\"/g" -e 's/^"/ImmutableList.of("/g' -e 's/"$/"),/g' input.txt > outputJavaImmutable.txt
以上で主要Mobile3言語でのImmutableな2次元配列が作成できる。