【Dart】Mapのソート
1. ソートするMap
Map<String, int> scoreMap = {
'Ichiro' : 80,
'Kawasaki' : 50,
'Ariana' : 60,
};
2.1. keyでソート
scoreMap = SplayTreeMap.from(scoreMap, (a, b) => a.compareTo(b));
// 出力結果: {Ariana: 60, Ichiro: 80, Kawasaki: 50}
2.2. 値でソート
NullSafety対応のために2箇所ほど「!」を使用しています。もし必要がない場合は「!」を削除してください。
SplayTreeMap.from(scoreMap, (a, b) => scoreMap[a]!.compareTo(scoreMap[b]!));
// 出力結果: {Kawasaki: 50, Ariana: 60, Ichiro: 80}
SplayTreeMap
は相互に関連して並べ替えることができるオブジェクトのマップです。
'dart:collection'をインポートすることでSplayTreeMapを使用できます。
3.1. ソートに失敗するケース
Ariana と Kawasakiの値が同じ値の場合、要素から Kawasaki が消えました。
このような場合の対処方法を次の題目で紹介したいと思います。
Map<String, int> scoreMap = {
'Ichiro' : 80,
'Kawasaki' : 50,
'Ariana' : 50,
};
SplayTreeMap.from(scoreMap, (a, b) => scoreMap[a]!.compareTo(scoreMap[b]!));
// 出力結果: {Ariana: 50, Ichiro: 80}
3.2. compareToメソッドを理解しよう
compareToメソッドの動きを確かめてみました。
final List<int> scoreList = [80, 50, 80, 60];
scoreList.sort((a, b) {
print('$aと$b');
print(a.compareTo(b));
print('-------------');
return a.compareTo(b);
});
// 出力結果
// 80と50
// 1
// -------------
// 80と80
// 0
// -------------
// 80と60
// 1
// -------------
// 80と60
// 1
// -------------
// 50と60
// -1
// -------------
compareToメソッドの戻り値は以下の通りです。
- aの値がbの値よりも大きい場合は「1」
- aの値とbの値が同じ場合は「0」
- aの値がbの値よりも小さい場合は「-1」
3.3. 解決策
compareToメソッドの戻り値が0にならないようにすれば良いです。
scoreMap = SplayTreeMap.of(scoreMap, (a, b) {
int compare = scoreMap[a]!.compareTo(scoreMap[b]!);
// compareが0(aとbの値が同じ場合)なら1(aがbよりも大きい場合)に置き換える。
return compare == 0 ? 1 : compare;
});
// 出力結果: {Ariana: 50, Saw: 50, Ichiro: 80}
Author And Source
この問題について(【Dart】Mapのソート), 我々は、より多くの情報をここで見つけました https://zenn.dev/mukkun69n/articles/21c00064bbe870著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol