本記事ではDartにおけるList、Map(連想配列)、List<Map>の解説および定義方法について説明します。
基本的な内容ではありますが時々ごちゃっとしがちなので備忘として残します。なお、ローカルデータベースにsqliteを使っている場合、SQLクエリ(SELECT文)の結果セットはList<Map>で返されるため、List<Map>の扱いを理解しておくと良いです。
プログラムの例はDartPadに貼り付けて実行結果を試してください。
List
Listは特定の型を持ったデータの配列です。型指定にはdynamicも可能で、複数の型をもったデータをひとつのリストに格納することができます。
Listの解説
リストのデータは[ ]内にカンマで区切って代入します。Listはデータ(要素)の順番を持っていて、左から0,1,2,3…番目となります。
Listのプログラム例は下記のとおりです。
void main() {
List<int> numList = [1, 2, 3, 4, 5];
for (int num in numList) {
print(num);
}
print(numList.elementAt(1));
}
Listデータにひとつずつアクセスするためには、for文を利用します。下記の例ではfor (int num in numList)として、numListというリスト変数に格納されたひとつの要素をint型を持ったnum変数に格納してひとつずつ取り出すことができます。
また、elementAt(n)でn番目の要素を取得できます。
実行結果はつぎのようになります。
Console
1
2
3
4
5
2
1–5までのすべての要素をfor文によって取り出すことができました。
また、numList.elementAt(1)とすると、ゼロから数えて2番めの要素(2)を取り出すことができました。
Map
MapはKeyとValueがペアになったデータコレクションです。
Mapの解説
{ }の中に:を挟んでデータペアを定義します。Map<K,V>でKeyとValueの型を定義します。なお、Valueをdynamic(動的な型)に指定することで、sqliteの結果セットがどのような型であっても代入することができます。
上記の例はsqliteでいえば、TEXT型のid列が1であり、かつTEXT型のdata列がdogであるひとつのレコードを表現しています。
Mapの要素を取り出す際には、下記のように記載します。map[‘data’]と指定することで、map変数のうち、キーがdataである値(Value)、dogを取り出しています。同様にmap[‘id’]とすれば1が返されます。
void main() {
Map<String, dynamic> map = {'id': '1', 'data': 'dog'};
print(map['data']);
}
実行結果はつぎのようになります。
Console
dog
List<Map>
最後はListとMapの組み合わせです。ListとMapを組み合わせ、Map型データをさらに配列にします。
宣言は下記のようにできます。mapListというリスト変数を宣言しています。mapListはMap<String,dynamic>であるmap型データをリストとして配列化します。
List<Map<String, dynamic>> mapList;
List<Map>のデータ定義は下記のようになります。
[ {'id': '1', 'data': 'dog'}, {'id': '2', 'data': 'cat'} ]
{から}までのMap型をひとつのデータセットとして、カンマで区切り、次のMap型{}が2番目のデータセットになります。複数のデータセットを[ ]で囲むことでまとめてリストに格納されます。
List<Map>からひとつずつ、すべてのデータを取り出すためには、for文を使います。下の例では、mapListというリスト型のデータからひとつずつ配列(リスト)の要素をmap変数に格納して取り出します。
for (var map in mapList) {
print(map);
}
print(map)とすると、要素を{}が付いたMap型そのままの形で返します。
Console
{id: 1, data: dog}
{id: 2, data: cat}
このままではデータとして取り扱いずらいため、よく使うのが下記の例です。
for (var map in mapList) {
print(map['data']);
}
Keyがdataである値(Value)を返します。
dog
cat
のようにMap型のキーがdataである値を返してくれます。このように要素の中の特定のキーをもつデータまで絞り込めると、データの表示と加工がしやすくなります。
以下まとめです。
void main() {
List<Map<String, dynamic>> mapList = [
{'id': '1', 'data': 'dog'},
{'id': '2', 'data': 'cat'},
{'id': '3', 'data': 'tiger'},
{'id': '4', 'data': 'horse'},
{'id': '5', 'data': 'zebra'}
];
for (var map in mapList) {
print(map);
print(map.values);
print(map['data'] + '\n');
}
}
実行結果はつぎのようになります。
Console
{id: 1, data: dog}
(1, dog)
dog
{id: 2, data: cat}
(2, cat)
cat
{id: 3, data: tiger}
(3, tiger)
tiger
{id: 4, data: horse}
(4, horse)
horse
{id: 5, data: zebra}
(5, zebra)
zebra
sqliteではクエリ(SELECT文)の結果セットがList<Map>で返されます。結果セットをひとつずつ取り出して画面に表示する際、上記のようにfor文を利用してウィジェットに表示できます。
List<Map>の扱いに慣れておくと、sqliteデータベースのデータが扱いやすくなります。