🎯

Mapから、値を取り出す方法いろいろ

2024/08/25に公開

🔅Tips

Mapから値を取り出したいが、よく方法を忘れることがある。昔のDartの本を読んでみたが、ソースコードが古くて参考にならなかった😣

なので、修正したコードでやりたいことをやってみた🔍

Listの中にあるMapから、countryというkeyがあるMapを取り出す

whereで、keyを指定して、ループする。

// Listの中にあるMapから、countryというkeyがあるMapを取り出す
void main(List<String> args) {
   
  var members = [
    {'name': 'Roko', 'age': 26, 'height': 170.0, 'weight':50.0},
    {'name': 'Nick', 'age': 31, 'height': 180.0, 'weight':70.0},
    {'name': 'Aya', 'age': 18, 'height': 160.0, 'weight':40.0},
    {'name': 'John', 'age': 20, 'height': 160.0, 'weight':60.0, 'country': '🇺🇸'},
    {'name': 'Rui', 'age': 50, 'height': 170.0, 'weight':60.0, 'country': '🇬🇧'},
  ];

  // value ageが、30を超えるMapを取り出す
  // データ型のエラーが出るので、as intで、castする
  var keyAge = members.where((m) => (m['age'] as int) > 30);

  // 結果を表示する
  for (var member in keyAge) {
    print(member);
  }

  print('----------------------------------------------------');

  // 20を超えて、&& weightが60を超えるMapを取り出す
  var keyAgeWeight = members.where((m) => (m['age'] as int) > 20 && (m['weight'] as double) > 60);

  // 結果を表示する
  for (var member in keyAgeWeight) {
    print(member);
  }
}

// {name: Nick, age: 31, height: 180.0, weight: 70.0}
// {name: Rui, age: 50, height: 170.0, weight: 60.0, country: 🇬🇧}
// ----------------------------------------------------
// {name: Nick, age: 31, height: 180.0, weight: 70.0}

heightが大きい順に並べる。同じなら、ageが大きい順に並べる

sort, compareToを使う。

// heightが大きい順に並べる。同じなら、ageが大きい順に並べる
void main(List<String> args) {
   
  var members = [
    {'name': 'Aya', 'age': 18, 'height': 160.0, 'weight': 40.0},
    {'name': 'John', 'age': 20, 'height': 160.0, 'weight': 60.0, 'country': '🇺🇸'},
    {'name': 'Rui', 'age': 50, 'height': 170.0, 'weight': 60.0, 'country': '🇬🇧'},
  ];

  // sortメソッドを使って、heightが大きい順に並べる
  // 同じなら、ageが大きい順に並べる
  // compareToメソッドを使って、比較する
  // https://api.flutter.dev/flutter/dart-core/num/compareTo.html
  // これが他より小さい場合は負の数、等しい場合はゼロ、大きい場合は正の数を返す。
  members.sort((a, b) {
    int result = (b['height'] as double).compareTo(a['height'] as double);
    if (result != 0) return result;
    return (b['age'] as int).compareTo(a['age'] as int);
  });

  print(members);

  // [{name: Rui, age: 50, height: 170.0, weight: 60.0, country: 🇬🇧}, {name: John, age: 20, height: 160.0, weight: 60.0, country: 🇺🇸}, {name: Aya, age: 18, height: 160.0, weight: 40.0}]
}

Listの中にあるMapから、countryというkeyがあるMapを取り出す

containsKeyで、Mapの中から指定した値を検索

// Listの中にあるMapから、countryというkeyがあるMapを取り出す
void main(List<String> args) {
   
  var members = [
    {'name': 'Roko', 'age': 26, 'height': 170.0, 'weight':50.0},
    {'name': 'Nick', 'age': 28, 'height': 180.0, 'weight':70.0},
    {'name': 'Aya', 'age': 18, 'height': 160.0, 'weight':40.0},
    {'name': 'John', 'age': 30, 'height': 160.0, 'weight':60.0, 'country': '🇺🇸'},
    {'name': 'Rui', 'age': 30, 'height': 170.0, 'weight':60.0, 'country': '🇬🇧'},
  ];

  var keyCountry = [];

  // for文でmembersをloop
  for(var m in members) {
    print(m);
    print('------------------------------------------------------------------------');
    // Mapの中にcountryというkeyがあるかどうかを確認
    if(m.containsKey('country')) {
      // keyCountryにcountryというkeyがあるMapを追加
      keyCountry.add(m);
    }
  }

  print(keyCountry);
  //   {name: Roko, age: 26, height: 170.0, weight: 50.0}
  // ------------------------------------------------------------------------
  // {name: Nick, age: 28, height: 180.0, weight: 70.0}
  // ------------------------------------------------------------------------
  // {name: Aya, age: 18, height: 160.0, weight: 40.0}
  // ------------------------------------------------------------------------
  // {name: John, age: 30, height: 160.0, weight: 60.0, country: 🇺🇸}
  // ------------------------------------------------------------------------
  // {name: Rui, age: 30, height: 170.0, weight: 60.0, country: 🇬🇧}
  // ------------------------------------------------------------------------
  // [{name: John, age: 30, height: 160.0, weight: 60.0, country: 🇺🇸}, {name: Rui, age: 30, height: 170.0, weight: 60.0, country: 🇬🇧}]
}

Mapを結合する

...(スプレッド演算子)を使う。

// Mapを結合する
void main(List<String> args) {
  var person1 = {'name': 'Roko', 'age': 26, 'height': 170.0, 'weight':50.0};
  var person2 = {'name': 'Nick', 'age': 28, 'height': 180.0, 'weight':70.0};
  
  var people = {...person1, ...person2};
  print(people);
  // {name: Nick, age: 28, height: 180.0, weight: 70.0}
}

年齢を並び替える。

SplayTreeMapを使って、ageが大きい順、が小さい順に並べる。

import 'dart:collection';

void main(List<String> args) {
  Map<String, int> woman = {
    'yui': 31,
    'minn': 23,
    'mumi': 35,
    'Roku': 26,
  };
  // SplayTreeMapを使って、ageが大きい順に並べる
  var ms = SplayTreeMap.from(woman,
  (a, b) => woman[b]!.compareTo(woman[a]!));

  print(ms);


  print('----------------------------------------------------');
  
  // SplayTreeMapを使って、ageが小さい順に並べる
  // 逆にするだけで、小さい順に並べることができる
  var ms2 = SplayTreeMap.from(woman,
  (a, b) => woman[a]!.compareTo(woman[b]!));
 
  print(ms2);
  //   {mumi: 35, yui: 31, Roku: 26, minn: 23}
  // ----------------------------------------------------
  // {minn: 23, Roku: 26, yui: 31, mumi: 35}
}

Listの中にあるMapから、valueが、jpのMapを取り出す

containsValueを使って、jpを指定。

// Listの中にあるMapから、valueが、jpのMapを取り出す
void main(List<String> args) {
   
  var members = [
    {'name': 'Roko', 'age': 26, 'height': 170.0, 'weight':50.0, 'country': 'jp'},
    {'name': 'Nick', 'age': 28, 'height': 180.0, 'weight':70.0},
    {'name': 'Aya', 'age': 18, 'height': 160.0, 'weight':40.0},
    {'name': 'John', 'age': 30, 'height': 160.0, 'weight':60.0, 'country': 'us'},
    {'name': 'Rui', 'age': 30, 'height': 170.0, 'weight':60.0, 'country': 'uk'},
  ];

  var keyCountry = [];

  // for文でmembersをloop
  for(var m in members) {
    print(m);
    print('------------------------------------------------------------------------');
    // Mapの中にjpというvalueがあるかどうかを確認
    if(m.containsValue('jp')) {
      // keyCountryにcountryというkeyがあるMapを追加
      keyCountry.add(m);
    }
  }

  print(keyCountry);
  //   {name: John, age: 30, height: 160.0, weight: 60.0, country: us}
  // ------------------------------------------------------------------------
  // {name: Rui, age: 30, height: 170.0, weight: 60.0, country: uk}
  // ------------------------------------------------------------------------
  // [{name: Roko, age: 26, height: 170.0, weight: 50.0, country: jp}]
}

key word 検索をしてみる

関数を使って、引数に渡した値が含まれていれば、データを取得。「aa」、「1」の部分一致すれば検索できるようにする。

void main(List<String> args) {
  var members = [
    {'name': 'Roko', 'age': 26, 'height': 170.0, 'weight': 50.0, 'label': '88'},
    {'name': 'Nick', 'age': 28, 'height': 180.0, 'weight': 70.0, 'label': '1111'},
    {'name': 'Aya', 'age': 18, 'height': 160.0, 'weight': 40.0, 'label': 'aaa'},
    {'name': 'John', 'age': 30, 'height': 160.0, 'weight': 60.0, 'label': 'jjj'},
    {'name': 'Rui', 'age': 30, 'height': 170.0, 'weight': 60, 'label': '333'},
  ];

  // key labelの中に、指定した値が一部でも含まれていれば、そのMapを取り出す
  List<Map<String, dynamic>> searchKeyword(String value) {
    // where()メソッドで条件に一致する要素を取得 Iterable型で返す
    // contains()メソッドで指定した値が含まれているかを判定 bool型で返す
    // toList()メソッドでList型に変換して返す
    return members.where((m) => m['label'].toString().contains(value)).toList();
  }

  var result = searchKeyword('aa');
  if (result.isNotEmpty) {
    for (var member in result) {
      print(member);
    }
  } else {
    print('Not Found');
  }

  // {name: Aya, age: 18, height: 160.0, weight: 40.0, label: aaa}

  result = searchKeyword('1');
  if (result.isNotEmpty) {
    for (var member in result) {
      print(member);
    }
  } else {
    print('Not Found');
  }

  // {name: Nick, age: 28, height: 180.0, weight: 70.0, label: 1111}
}

まとめ

過去にも似たような記事を書いた気がしますが、いろんなパターンを試していなかったので、ビジネスロジックの勉強をする目的で記事を書いてみました。

Discussion