Dart配列まとめ

いつも配列の使い方を忘れてしまうので、よく使うもの/便利そうなものをまとめてみました。

宣言

初期値を指定して宣言します。

List<String> titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];
List<int> characters = [1024, 2048, 4096, ];

初期値を指定せずに宣言します

List<String> titles = [];
List<int> characters = [];

追加

配列を追加する方法はいくつかあります。

List<String> titles = [];

// addメソッド
titles.add('小説タイトル1');

// addAllメソッド
titles.addAll(['小説タイトル2', '小説タイトル3', ]);

// insertメソッド
titles.insert(0, '小説タイトル0');

// insertAllメソッド
titles.insertAll(1, ['小説タイトル1より前の1', '小説タイトル1より前の2', ]);

print(titles);
// [小説タイトル0, 小説タイトル1より前の1, 小説タイトル1より前の2, 小説タイトル1, 小説タイトル2, 小説タイトル3]
  • add
    • 指定した値を配列の末尾に追加します
  • addAll
    • 指定した配列を配列の末尾に追加します
  • insert
    • 指定したインデックスに指定した値を挿入します
  • insertAll
    • 指定したインデックスに指定した配列を挿入します

変更/置換

配列の値を変更する方法もいくつかあります。

List<String> titles = ['小説タイトル1', '小説タイトル2', '小説タイトル4', ];

// インデックスを指定して更新
titles[0] = '小説タイトル1更新';
print(titles); // [小説タイトル1更新, 小説タイトル2, 小説タイトル4]

// replaceRangeメソッドで置換
titles.replaceRange(1, 2, ['小説タイトル2更新', '小説タイトル3更新', ]);
print(titles); // [小説タイトル1更新, 小説タイトル2更新, 小説タイトル3更新, 小説タイトル4]

// fillRangeメソッドで上書き
titles.fillRange(0, 2, '小説タイトル');
print(titles); // [小説タイトル, 小説タイトル, 小説タイトル3更新, 小説タイトル4]
  • インデックスを指定して更新
    • 配列のインデックスを指定して値を代入します
    • 配列の始まりはゼロから
  • replaceRangeメソッドで置換
    • メソッドのパラメータは開始位置・終了位置・置換したい配列です
    • 開始~終了位置の1つ前(上記の例で言うと「小説タイトル2」)を、置換したい配列(「小説タイトル2更新」「小説タイトル3更新」)で置換しています
  • fillRangeメソッドで上書き
    • メソッドのパラメータは開始位置・終了位置・上書きする値です
    • 開始~終了位置の1つ前(上記の例で言うと「小説タイトル1更新」「小説タイトル2更新」)を、指定した値「小説タイトル」で上書きしています

削除

配列の値を削除する方法もいくつかありますが、使い方は注意してください。

List<String> titles = [];

// removeメソッド
titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];
print(titles.remove('小説タイトル1更新')); // false
print(titles.remove('小説タイトル1')); // true

// removeAtメソッド
titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];
titles.removeAt(0);
print(titles); // [小説タイトル2, 小説タイトル3]

// removeLastメソッド
titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];
titles.removeLast();
print(titles); // [小説タイトル1, 小説タイトル2]

// removeRangeメソッド
titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];
titles.removeRange(1, 3);
print(titles); // [小説タイトル1]

// removeWhereメソッド
titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];
titles.removeWhere((value) => value == '小説タイトル2');
print(titles); // [小説タイトル1, 小説タイトル3]
  • remove
    • 指定した値にマッチした配列を削除します
    • 指定した値が配列にあればtrue、なければfalseを返します
      • 削除したつもりでも削除できていないことがあるので注意してください
  • removeAt
    • 指定したインデックスの配列を削除します
  • removeLast
    • 配列の最後を削除します
  • removeRange
    • パラメータは開始位置・終了位置です
    • 開始位置~終了位置の1つ前の範囲で配列を削除します
  • removeWhere
    • 条件を満たす配列を削除します

情報取得

配列数

配列数の取得にはlengthプロパティを利用します。

List<String> titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];

print(titles.length);
// 3

指定値のインデックス取得

List<String> titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];

print(titles.indexOf('小説タイトル1')); // 0
print(titles.indexOf('小説タイトル4')); // -1
  • 配列に指定値が見つからない場合は-1を返す

配列に指定値が存在するか

List<String> titles = ['小説タイトル1', '小説タイトル2', ];

print(titles.contains('小説タイトル1')); // true
print(titles.contains('小説タイトル3')); // false

配列の要素が1つ以上条件を満たすか

List<String> titles = ['小説タイトル1', '小説タイトル2', ];

print(titles.any((value) => value == '小説タイトル1')); // true
print(titles.any((value) => value == '小説タイトル3')); // false

配列の要素が全て条件を満たすか

List<String> titles = ['小説タイトル1', '小説タイトル2', ];

print(titles.every((value) => value.contains('小説タイトル1'))); // false
print(titles.every((value) => value.contains('小説タイトル'))); // true

条件を満たす配列を取得

List<String> titles = ['小説タイトル1', '小説タイトル2', ];

print(titles.where((value) => value.contains('小説タイトル1')).toList()); // [小説タイトル1]
  • whereメソッドが返すのはイテレータなので、上記の例では.toListメソッドで配列に変換しています

配列を結合した値を取得

List<String> titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];
print(titles.join('、')); // 小説タイトル1、小説タイトル2、小説タイトル3

List<dynamic> arr = [1, '二', false, ];
print(arr.join('、')); // 1、二、false
  • パラメータのセパレータで区切った配列の文字列を取得できます
  • 文字列以外が含まれていても文字列変換された値で取得できるようです

操作

クリア

List<String> titles = ['小説タイトル1', '小説タイトル2', ];

titles.clear();
  
print(titles); // []

結合

普通にaddAllメソッドを使う以外の結合方法もあります。

List<String> titles1 = ['小説タイトル1', '小説タイトル2', ];
List<String> titles2 = ['小説タイトル3', '小説タイトル4', ];

// addAllをカスケードで
print([]..addAll(titles1)..addAll(titles2)); // [小説タイトル1, 小説タイトル2, 小説タイトル3, 小説タイトル4]

// 普通に+で
print(titles1 + titles2); // [小説タイトル1, 小説タイトル2, 小説タイトル3, 小説タイトル4]

// スプレッド演算子で
print([...titles1, ...titles2, ]); // [小説タイトル1, 小説タイトル2, 小説タイトル3, 小説タイトル4]
  • addAllをカスケードで
    • 空の配列([])変数にカスケード記法(..)でaddAllメソッドを呼べます
    • メソッドチェーンのように使えます
  • 普通に+で
    • 配列+配列でも結合できます
  • スプレッド演算子で
    • 空の配列の初期化時にスプレッド演算子(…)を使って配列を差し込めます
      • ListViewのchildrenに複数の配列変数を指定したい場合、この方法が使えます
      • ListView(children: […var1, Text(‘test’), …var2])のような形です

繰り返し処理

List<String> titles = ['小説タイトル1', '小説タイトル2', '小説タイトル3', ];

titles.forEach((value) {
  print('値は$valueです');
});

ソート

  List<String> titles = ['小説タイトル2', '小説タイトル1', '小説タイトル3', ];

  titles.sort((a, b) {
    return a.compareTo(b);
  });
  
  print(titles); // [小説タイトル1, 小説タイトル2, 小説タイトル3]