🎯

Dart List indexed

2024/09/18に公開

indexedとは?

XでDart3.0の文法を使った例を見て興味を持った💡

こんな意味らしい?

「indexed」は「索引を付ける」という意味です。また、Pythonやデータベースなどでは「インデックス」という概念が用いられています。
Pythonにおける「インデックス」とは、リスト型変数内の要素がリスト内で何番目かを示すものです。インデックスは0から始まり、指定された値が存在しない場合はエラーが発生します。また、リスト内の要素はインデックスで指定することで代入によって変更することができます。
また、リスト内の要素を検索する「list.index()」メソッドもあります。このメソッドは、リスト内の要素を検索し、その要素が最初に出現するインデックスを返します。
一方、データベースにおける「インデックス」とは、目的のレコードを効率よく取得するための「索引」のことです。テーブル内の特定の列を識別できる値(キー値)と、キー値によって特定された列のデータが格納されている位置を示すポインタで構成されています。

example

void main() {
  List<int> items = [2,5,3,4,1];
  for(final (index, item) in items.indexed) {
    print("items[$index] = $item");
  }
}

実行結果はこんな感じです!

items[0] = 2
items[1] = 5
items[2] = 3
items[3] = 4
items[4] = 1

Exited.

内部実装

/// Operations on iterables.
("3.0")
extension IterableExtensions<T> on Iterable<T> {
  /// Pairs of elements of the indices and elements of this iterable.
  ///
  /// The elements are `(0, this.first)` through
  /// `(this.length - 1, this.last)`, in index/iteration order.
  ('vm:prefer-inline')
  Iterable<(int, T)> get indexed => IndexedIterable<T>(this, 0);

  /// The first element of this iterator, or `null` if the iterable is empty.
  T? get firstOrNull {
    var iterator = this.iterator;
    if (iterator.moveNext()) return iterator.current;
    return null;
  }

翻訳すると

/// イテラブルに対する操作。
以降(3.0)
extension IterableExtensions<T> on Iterable<T> {.
  /// このイテーブルのインデックスと要素のペア。
  ///
  /// 要素は `(0, this.first)`から
  /// `(this.length - 1, this.last)`、インデックス順/繰り返し順。
  pragma('vm:prefer-inline')
  Iterable<(int, T)> get indexed => IndexedIterable<T>(this, 0)/// このイテレータの最初の要素、またはイテレータブルが空の場合は `null`.
  T?
    var iterator = this.iterator;
    if (iterator.moveNext()) return iterator.current;
    null を返します;
  }

本当にできるのか?

試してみた。AIによると...

はい、Dart 3.0の新しい機能を使用してリストの要素を検索するロジックを実装できます。Dart 3.0では、パターンマッチングや記録型(records)など、コードをより簡潔で表現力豊かにする機能が導入されました。

以下に、リストの要素を検索するいくつかの方法を示します:

void main() {
  List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  
  // 例1: firstWhere を使用した検索
  int firstEven = numbers.firstWhere((number) => number.isEven);
  print('最初の偶数: $firstEven');

  // 例2: where と first を使用した検索
  int firstOddGreaterThanFive = numbers.where((number) => number.isOdd && number > 5).first;
  print('5より大きい最初の奇数: $firstOddGreaterThanFive');

  // 例3: indexed と firstWhere を使用したインデックス付き検索
  var (index, value) = numbers.indexed.firstWhere((element) => element.$2 > 7);
  print('7より大きい最初の数: インデックス $index, 値 $value');

  // 例4: パターンマッチングを使用した検索
  for (final number in numbers) {
    switch (number) {
      case int n when n.isEven && n > 5:
        print('5より大きい最初の偶数: $n');
        break;
      case _:
        continue;
    }
    break;
  }

  // 例5: カスタム拡張メソッドを使用した検索
  int? firstMultipleOfThree = numbers.findFirst((n) => n % 3 == 0);
  print('最初の3の倍数: $firstMultipleOfThree');
}

// カスタム拡張メソッド
extension ListSearchExtension<T> on List<T> {
  T? findFirst(bool Function(T) test) {
    for (final element in this) {
      if (test(element)) return element;
    }
    return null;
  }
}

この例では、Dart 3.0の新機能を活用して、リストの要素を検索するいくつかの方法を示しています:

  1. firstWhere メソッド: 条件に合う最初の要素を返します。

  2. wherefirst の組み合わせ: 条件に合う要素のイテラブルを作成し、その最初の要素を取得します。

  3. indexedfirstWhere の組み合わせ: インデックスと値のペアを使って検索します。これはDart 3.0の新機能である記録型(records)を利用しています。

  4. パターンマッチング: switch 文と case のガード条件を使用して、特定の条件に合う要素を検索します。

  5. カスタム拡張メソッド: リストに対して独自の検索メソッドを定義しています。これは特定の検索パターンが頻繁に使用される場合に便利です。

これらの方法は、検索条件や期待される結果に応じて選択できます。Dart 3.0の新機能を使用することで、コードがより読みやすく、表現力豊かになっています。

特定の検索シナリオや、さらに詳細な実装についてご質問がありましたら、お知らせください。

void main() {
  List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  
  // 例1: firstWhere を使用した検索
  int firstEven = numbers.firstWhere((number) => number.isEven);
  print('最初の偶数: $firstEven');

  // 例2: where と first を使用した検索
  int firstOddGreaterThanFive = numbers.where((number) => number.isOdd && number > 5).first;
  print('5より大きい最初の奇数: $firstOddGreaterThanFive');

  // 例3: indexed と firstWhere を使用したインデックス付き検索
  var (index, value) = numbers.indexed.firstWhere((element) => element.$2 > 7);
  print('7より大きい最初の数: インデックス $index, 値 $value');

  // 例4: パターンマッチングを使用した検索
  for (final number in numbers) {
    switch (number) {
      case int n when n.isEven && n > 5:
        print('5より大きい最初の偶数: $n');
      case _:
        continue;
    }
  }

  // 例5: カスタム拡張メソッドを使用した検索
  int? firstMultipleOfThree = numbers.findFirst((n) => n % 3 == 0);
  print('最初の3の倍数: $firstMultipleOfThree');
}

// カスタム拡張メソッド
extension ListSearchExtension<T> on List<T> {
  T? findFirst(bool Function(T) test) {
    for (final element in this) {
      if (test(element)) return element;
    }
    return null;
  }
}

実行結果

感想

Dartは日々進化して他の言語でできることができるようになっていくのかなと思いました?

Discussion