Swift, Kotlin, JavaでImmutableな二次元配列(Collection)を作成する方法

投稿者: | 2019年4月17日

各言語における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"]]
  1. Kotlin:二次元のListを用いる
val my2DStringList = listOf(listOf<String>("a0","b0","c0","d0","e0"),
        listOf<String>("a1","b1","c1","d1","e1"))
  1. 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へ
  1. シングルクォーテーションをダブルクオーテーションへ (-e “s/\’/\”/g”)
  2. 一行を[],で囲む (-e ‘s/^”/[“/g’ -e ‘s/”$/”],/g’)
  3. 最終行の,を削除し全体を[]で囲む(手動)
  4. それを代入の右辺へ貼り付ける。(手動)

1.と2.のsedコマンドは-eオプションで連続させると

sed -e "s/\'/\"/g" -e 's/^"/["/g' -e 's/"$/"],/g' input.txt > outputSwift.txt

outputSwift.txtをテキストエディタで開き、最後の,を除いて対象の[]内へペーストする。

  • Kotlinの二次元Listへ
  1. シングルクォーテーションをダブルクオーテーションへ (-e “s/\’/\”/g”)
  2. 一行をistOf(),で囲む (-e ‘s/^”/listOf(“/g’ -e ‘s/”$/”),/g’)
  3. 最終行の,を削除し全体をlistOf()で囲む(手動)
  4. それを代入の右辺へ貼り付ける。(手動)

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次元配列が作成できる。

コメントを残す