🎯
Mapから、値を取り出す方法いろいろ
🔅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