🗿

Dartのsortと便利なpackage:collectionについて

2022/01/08に公開

Dartの配列はmutableなので、sortするとList自体もsortされる
配列が値型のSwiftに馴染んでいる自分には違和感があった。

// sortはvoid型なので、 // void sort([int Function(int, int)? compare])
// 値を返す場合はCascade notation `..` を使う
final sorted1 = list..sort();
  
// DartのListはmutableなのでsortするとlist自体もsortされる
// list: [0, 2, 3, 5, 10] ←listもsortされる
// sorted1: [0, 2, 3, 5, 10]
print('list: $list');
print('sorted1: $sorted1');

もとの配列を変更したくない場合、Spread演算子 ... を活用する

final list = [0, 10, 5, 2, 3];
// 元のListの値は変更したくない場合、Spread演算子 `...` でコピーを作る
final sorted2 = [...list]..sort();

// list: [0, 10, 5, 2, 3]
// sorted2: [0, 2, 3, 5, 10]
print('list: $list');
print('sorted2: $sorted2');

自分が慣れてないからか上記を常に意識しなければならなかったが、Dart公式のpackage:collection のsortedメソッドを使うと上記を意識せずにsortした新たな配列を返してくれるので便利。

final list = [0, 10, 5, 2, 3];
// collectionパッケージのsortedだとsort2のように意識しなくても
// sortした配列を返してくれる。便利
final sorted3 = list.sorted((a, b) => a.compareTo(b));

// list: [0, 10, 5, 2, 3]
// sorted3: [0, 2, 3, 5, 10]
print('list: $list');
print('sorted3: $sorted3');

DartPadに挙動を確認できるサンプルを上げました。試してみたい方はご活用ください
https://dartpad.dev/?null_safety=true&id=35480f5d9efa73d75e34b97ad0d54b94

Discussion