Dart言語のList型についての色々をまとめる
Listとは
Flutterでアプリ開発するには必須といってもいいDart言語のListについてのいろいろをメモとしてまとめます。
まず、一言で表すと
Listとは他の言語での配列(Array)です。
細かい部分は違うものの使い方は完全に配列と同じです。
FlutterではUIを全てコードで書いていくので、もちろん良く使われるようなListViewのようなUIも全てコードで書いていく必要があります。
任意のデータを扱う以外にも、そういうUIの生成にも使うのでListの使い方は必須知識です。
といっても他の言語と劇的に違うわけではないのでプログラミング経験者なら戸惑うことはほとんどないと思います。
定義の仕方やインデックス指定、List操作に便利なメソッドをいくつか紹介します。
定義の仕方
可変長と固定長
Listは定義の仕方によってそのListの長さが変わるのか(可変長)、変わらないのか(固定長)を決めることができます。
普通は可変長のListを定義することが多いとは思いますが、Listの長さを変えたくない場合や、変わる必要のない場合は長さが変わることのない固定長のListの定義ができます。
また、1つのListに入れることのできるデータの型は同一でないとダメです。(intなら全てint、Stringなら全てStringみたいに)
まずは可変長のListの定義の種類とその出力結果をまとめます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//長さ0、データの型宣言なし(初期値なし) var list1 = []; //実行結果 [] var list2 = List(); //[] //長さ0、データの型宣言あり(初期値なし) List<int> list3 = []; //[] //長さ3、データの型宣言なし(初期値なし) var list4 = []..length = 3; //[null, null, null] //長さ3、データの型宣言なし(初期値あり) var list5 = [1, 2, 3]; //[1, 2, 3] //長さ3、データの型宣言あり(初期値あり) List<String> list6 = ['a', 'b', 'c']; //['a', 'b', 'c'] |
Listクラスのメソッド.generateを使って長いListを素早く定義することもできます。下の例では完結に見えるために短いListの定義ですが、普通このくらいならメソッド使わず自分で打ちますよね笑
1 2 3 4 5 6 7 8 9 |
//長さ3、データの型宣言なし(初期値なし) var list = new List.generate(3, (i)=>null); //[null, null, null] //長さ3、データの型宣言なし(初期値あり) var list = new List.generate(3, (i)=>i); //[0, 1, 2] var list = new List.generate(3, (i)=>i*i); //[0, 1, 4] //長さ3、データの型宣言あり(初期値あり) (listStr = ['a', 'b', 'c']) List<String> list = new List.generate(3, (i)=>listStr[i]+listStr[i]); //['aa', 'bb', 'cc'] |
次に固定長のListの定義とその出力をまとめます。.filledメソッドを使う場合もまとめて表示します。
1 2 3 4 5 6 7 8 |
//長さ3、データの型宣言なし(初期値なし) var list = List(3); //[null, null, null] //長さ3、データの型宣言なし(初期値あり) var list = List.filled(3, 0); //[0, 0, 0] //長さ3、データの型宣言あり(初期値あり) List<String> list = List.filled(3, '0'); //['0', '0', '0'] |
ListのList(二次元配列)
Listの中にListを入れて定義することもできます。
1 2 3 4 5 6 |
List<List<int>> list = [[1, 2, 3], [4, 5], [6]]; //[[1, 2, 3], [4, 5], [6]] List<String> listStr1 = ['a', 'b', 'c']; List<String> listStr2 = ['a', 'b']; List<String> listStr3 = ['a']; List<List<String>> list = [listStr1, listStr2, listStr3]; //[['a', 'b', 'c'], ['a', 'b'], ['a']] |
インデックス指定
他の言語同様下のようにインデックスを指定してList内の任意のデータを取得することができます。インデックスというのは要素左から順番につけられた番号で0から始まります。つまり指定できるインデックスは0から(要素の数-1)の数までということです。
変数名[インデックス]
インデックスは左から順に 0 1 2 3 ・・・と続く
1 2 3 4 5 6 7 8 9 |
var list = [1, 2, 3, 4, 5]; var num1 = list[0]; //1 var num5 = list[4]; //5 //二次元の時 List<List<int>> list = [[1,2,3],[4, 5],[6]]; var num1_1 = list[0][0]; //1 var num2_2 = list[1][1]; //5 var num3_1 = list[2][0]; //6 |
便利なメソッド
ListクラスにはListを扱うための便利なメソッドが結構たくさんあります。
覚える必要はありませんが、「こんなのあるんだー」というくらいでさらっと読んでおくといざ「Listでこんな処理がしたい!」となった時に役に立つと思います。
.length
これはメソッドではなくプロパティですがListを扱う上で非常によく使います。
Listの要素の長さを返してくれます。
1 2 |
var list = [1, 2, 3, 4, 5]; var listLength = list.length; //5 |
.add
Listの最後の要素の後に新しい要素を加えます。(*1)しかし固定長で定義している場合はエラーになります。
引数:加える新しい要素
1 2 |
var list = [1, 2, 3, 4, 5]; list.add(5); //[1, 2, 3, 4, 5, 5] |
.insert
任意のインデックス位置に新しい要素を加えます。
引数:加える要素のインデックス、加える新しい要素
1 2 |
var list = [1, 2, 3, 4, 5]; list.insert(1, 5); //[1, 5, 2, 3, 4, 5] |
.removeAt
任意のインデックスにある要素を削除します。
引数:削除する要素のインデックス
1 2 |
var list = [1, 2, 3, 4, 5]; list.removeAt(1); //[1, 3, 4, 5] |
.indexOf
任意の要素がListの中にあればそのインデックスを、なければ-1を返します。
もし同じ要素がListの中に複数ある場合は第二引数にその要素だけ数えた順番で指定できます。
引数:任意の要素、(その要素自体の順番)
1 2 3 |
var list = [1, 5, 3, 4, 5]; list.indexOf(5); //1 list.indexOf(5, 2); //4 |
.shuffle
要素をシャッフルします。
1 2 |
var list = [1, 2, 3, 4, 5]; list.shuffle(); //[5, 2, 1, 3, 4] |
.forEach
各要素を順番に取り出し、任意の処理を行います。
1 2 |
var list = [1, 2, 3, 4, 5]; list.forEach(num => count += num); //15 |
この他にも便利なメソッドがたくさん用意されています。
もちろん公式のドキュメントには用意されているプロパティ、メソッドが全て書いてあります。気になる方は見て見てください。
最後に
今回は自分なりにDartのList型についてかなり丁寧にまとめてました。
実際にアプリで使う際には必要なデータをうまくまとめたり、ListViewなどのWidgetでリストのUI生成に使ったりします。
近いうちに基本的なListViewの生成の仕方などを紹介しようと思います。
コメント