🧑‍🚀

【Dart】Listを複数値でsort

2021/12/18に公開

Flutter sort と検索すると公式ドキュメントが見つかりますが 1 つの値で sort する方法のみだったので
複数値を使う sort の方法を紹介します。

sort と Comparator を使用します。

ポイントになるのが comareTo メソッドで比較対象の値が同値,つまり 0 の時に次の値をチェックさせます。
https://api.flutter.dev/flutter/dart-core/List/sort.html
https://api.flutter.dev/flutter/dart-core/Comparator.html

値が一つの sort

  var values = [1, 2, 3, 4, 4, 1];
  values.sort(
    (a, b) {
      return a.compareTo(b);
    },
  );
// 結果 [1, 1, 2, 3, 4, 4]

2 次元配列の sort

  var values = [
    [1, 2],
    [1, 1],
    [2, 1],
    [1, 4],
    [2, 2],
    [1, 3],
  ];
  values.sort(
    (a, b) {
      return a[0].compareTo(b[0]);
    },
  );
// 結果 [[1, 2], [1, 1], [1, 4], [1, 3], [2, 1], [2, 2]]
// 一つ目の値でしかチェックしていないので1つ目はソートできてるけど2つ目は配列順になっている

値を 2 つ使う sort

  var values = [
    [1, 2],
    [1, 1],
    [2, 1],
    [1, 4],
    [2, 2],
    [1, 3],
  ];
  values.sort(
    (a, b) {
      int result = a[0].compareTo(b[0]);
      if (result != 0) return result;
      return a[1].compareTo(b[1]);
    },
  );

// 結果 [[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2]]

値を 3 つ使う sort

  var values = [
    [1, 2, 0],
    [1, 1, 2],
    [2, 1, 3],
    [1, 3, 3],
    [2, 2, 1],
    [1, 1, 1],
    [1, 3, 2],
  ];
  values.sort(
    (a, b) {
      int result1 = a[0].compareTo(b[0]);
      if (result1 != 0) return result1;
      int result2 = a[1].compareTo(b[1]);
      if (result2 != 0) return result2;
      return a[2].compareTo(b[2]);
    },
  );
// 結果 [[1, 1, 1], [1, 1, 2], [1, 2, 0], [1, 3, 2], [1, 3, 3], [2, 1, 3], [2, 2, 1]]
GitHubで編集を提案

Discussion