🎉

【Flutter】Dartで使える配列の使い方、便利な関数一覧

2022/04/29に公開

はじめに

Flutterで開発をしていて、配列操作の関数を忘れるので、

  1. メモ代わり
  2. 知識定着のため

を理由に書いております。
間違えている点や、追加してほしい関数などがありましたらお気軽にコメントください🙂
他にも使用した関数が増えれば追加しようと思います!

データを追加する

add | データを一つ追加する

リストの一番後ろに追加します。

final numbers = <int>[1, 2, 3];
numbers.add(4);
print(numbers); // [1, 2, 3, 4]
addAll | データを複数追加する

こちらも同様一番後ろに追加します。

final numbers = <int>[1, 2, 3];
numbers.addAll([4, 5, 6]);
print(numbers); // [1, 2, 3, 4, 5, 6]
insert | 指定した番号にデータを一つ追加する

配列のindex番号を指定して、その場所に新しい要素を追加します。
下記の例ではindex = 2なので0から数えて3番目に10という要素を追加しています。

final numbers = <int>[1, 2, 3, 4];
const index = 2;
numbers.insert(index, 10);
print(numbers); // [1, 2, 10, 3, 4]
insertAll | 指定した番号にデータを複数追加する

insert関数の複数版です。

final numbers = <int>[1, 2, 3, 4];
final insertItems = [10, 11];
numbers.insertAll(2, insertItems);
print(numbers); // [1, 2, 10, 11, 3, 4]

データを削除する

clear | 配列の中身を全て削除する

その名の通り、配列の中身を全て削除し、空の配列にします。

final numbers = <int>[1, 2, 3];
numbers.clear();
print(numbers.length); // 0
print(numbers); // []
remove | 指定した要素を削除する

私は知らなかったのですが、リストから指定した要素を消してくれるだけでなく、削除できたかどうか(指定した要素があったかどうか)のboolを返してくれるみたいです。

final parts = <String>['head', 'shoulders', 'knees', 'toes'];
final retVal = parts.remove('head'); // true
print(parts); // [shoulders, knees, toes]
The method has no effect if [value] was not in the list.

final parts = <String>['shoulders', 'knees', 'toes'];
// Note: 'head' has already been removed.
final retVal = parts.remove('head'); // false
removeAt | 指定したindex番号の要素を削除する

配列の番号を指定して、その番号の要素を削除してくれる関数です。こちらも知らなかったのですが、削除した要素を返してくれるみたいです。

final parts = <String>['head', 'shoulder', 'knees', 'toes'];
final retVal = parts.removeAt(2); // knees
print(parts); // [head, shoulder, toes]
removeLast | 配列の最後の要素を削除する

配列の最後の要素を削除し、削除した要素を返してくれます。

final parts = <String>['head', 'shoulder', 'knees', 'toes'];
final retVal = parts.removeLast(); // toes
removeRange | 範囲を指定して削除する

removeRange(start, end)なんですが、endの配列番号の要素は消さないというところがなんともややこしいです。
簡単な覚え方としては上記のremoveRange(1,4)の例だと、
[1, 2, 3, 4, 5]の1番目の[2]からend(4) - start(1)をした3つ分消しますよということ。
2から3つ消すので2と3と4が消えて、[1, 5]になると考えると覚えやすいです。

final numbers = <int>[1, 2, 3, 4, 5];
numbers.removeRange(1, 4);
print(numbers); // [1, 5]
removeWhere | 指定した条件に当てはまるものを全て削除する

条件を指定して、その条件に当てはまる要素を全て削除する関数です。下記の例だと、文字数が3文字のものを削除しています。文字数が3文字のonetwoが削除され、新しい配列ができています。返り値はありません。

final numbers = <String>['one', 'two', 'three', 'four'];
numbers.removeWhere((item) => item.length == 3);
print(numbers); // [three, four]

要素を探す

contains | 指定したものがリストにあるかどうかをboolで返す

指定したものがリストにあればtrueを、なければfalseを返す関数です。
下記例ではgasPlanetsというMapに対して、

  1. key1の要素はあるか? => true
  2. key5の要素はあるか? => false
  3. valueJupiterの要素はあるか? => true
  4. valueMerucyの要素はあるか? => false
    となってます。
final gasPlanets = <int, String>{1: 'Jupiter', 2: 'Saturn'};
final containsOne = gasPlanets.keys.contains(1); // true
final containsFive = gasPlanets.keys.contains(5); // false
final containsJupiter = gasPlanets.values.contains('Jupiter'); // true
final containsMercury = gasPlanets.values.contains('Mercury'); // false
any | リストの要素のうち、指定した条件が一つでもあればtrueを返す

指定した条件に一致する要素が一つでもあればtrueを、なければfalseを返す関数です。
下記例ではnumbersリストの中に

  1. 5以上の数値はあるか? => true
  2. 10以上の数値はあるか? => false

となっています。

final numbers = <int>[1, 2, 3, 5, 6, 7];
var result = numbers.any((element) => element >= 5); // true;
result = numbers.any((element) => element >= 10); // false;
every | リストの要素のうち、指定した条件が全てに当てはまればtrueを返す

上のany関数の全部版です。
any関数は一つでも当てはまればtrueを返したのに対し、every関数ではすべてが条件に一致しないとtrueを返さないのが特徴です。
下記例ではplanetsByMassというMapの中に

  1. keyがすべて1より小さいか? => true

となっています。

final planetsByMass = <double, String>{0.06: 'Mercury', 0.81: 'Venus',
  0.11: 'Mars'};
// Checks whether all keys are smaller than 1.
final every = planetsByMass.keys.every((key) => key < 1.0); // true
firstWhere | 指定した条件に当てはまった要素を返す

配列の最初から確認し、一番初めに条件に当てはまった要素を返してくれます。
条件に当てはまった時点で終了します。
orElseを書くと、条件に当てはまるものがなかった時の返り値を指定することができます。
下記、一番下の例の場合、当てはまる条件がなければ-1を返します。

final numbers = <int>[1, 2, 3, 5, 6, 7];
var result = numbers.firstWhere((element) => element < 5); // 1
result = numbers.firstWhere((element) => element > 5); // 6
result =
    numbers.firstWhere((element) => element > 10, orElse: () => -1); // -1

条件に一致しないときにnullを返す方法

上記の例でnullを返したい時はfirstWhere関数の第2引数であるorElseを使用します。
下記の例だと、numbersの中から4を探していますが、ないのでnullが返されます。
元々定義しているnumbersリストがint型でnullableではないので、int?型にcastしないといけない点がややこしいです。

final numbers = <int>[1, 2, 3, 5, 6, 7];
int? result = numbers.cast<int?>().firstWhere((element) =>
    element == 4, 
    orElse: () => null
); // null

要素を並び替える

sort | compare関数で指定された順序でソートする

(a, b)が分かりにくいかもしれませんが、下記の一番上の例で言うと
1回目. (a, b) => (two, three)
2回目. (a, b) => (three, four)
compareTo関数は中身の要素と比較して、大きければ1を返し、小さければ-1を返す関数です。
同じ数字なら0を返します。
下記2番目の例のように、sortする配列が数字であれば、sort関数を呼び出すだけで並び替えてくれます。

final numbers = <String>['two', 'three', 'four'];
// Sort from shortest to longest.
numbers.sort((a, b) => a.length.compareTo(b.length));
print(numbers); // [two, four, three]

final numbers = <int>[13, 2, -11, 0];
numbers.sort();
print(numbers); // [-11, 0, 2, 13]

final numbers = <String>['one', 'two', 'three', 'four'];
numbers.sort((a, b) => a.length.compareTo(b.length));
print(numbers); // [one, two, four, three] OR [two, one, four, three]

その他、便利?な関数

asMap | 配列をMapに変換する

配列をMapにして返します。keyの値はindex番号になります。

var words = <String>['fee', 'fi', 'fo', 'fum'];
var map = words.asMap();  // {0: fee, 1: fi, 2: fo, 3: fum}
map.keys.toList(); // [0, 1, 2, 3]
GitHubで編集を提案

Discussion