排序键为字符串,值为整数列表的Map的最佳方法是什么。
var userVotes = {
"arbourn": [1, 0, 7],
"burun": [2, 9, 0, 1],
"niko": [1, 0, 3, 10],
};
基于列表(值)进行排序。 1.先赢更高的名单 2.如果值相同,则以长度较大的列表为准。 3.否则,地图没有变化(不是很重要) 预期输出为
var userVotes = {
"burun": [2, 9, 0, 1],
"arbourn": [1, 0, 7],
"niko": [1, 0, 3, 10],
};
性能标准-列表的长度限制为<= 100,键的数量限制为<= 1000。
谢谢!
答案 0 :(得分:3)
可以执行以下操作:
import 'dart:collection';
void main() {
final userVotes = {
"arbourn": [1, 0, 7],
"burun": [2, 9, 0, 1],
"niko": [1, 0, 3, 10],
"niko2": [1, 0, 3, 10, 0],
};
final sortedMap =
LinkedHashMap.fromEntries(userVotes.entries.toList()..sort(sortMethod));
sortedMap.forEach((key, value) => print('$key: $value'));
}
int sortMethod(MapEntry<String, List<int>> e1, MapEntry<String, List<int>> e2) {
final l1 = e1.value;
final l2 = e2.value;
final minLength = l1.length > l2.length ? l2.length : l1.length;
for (var i = 0; i < minLength; i++) {
if (l1[i] > l2[i]) {
return -1;
} else if (l1[i] < l2[i]) {
return 1;
}
}
return l2.length.compareTo(l1.length);
}
哪个输出:
burun: [2, 9, 0, 1]
arbourn: [1, 0, 7]
niko2: [1, 0, 3, 10, 0]
niko: [1, 0, 3, 10]
由于对映射进行排序实际上并不是那么好,因此更好的策略是将每个键值对转换为将UserVote
实现为其他compareTo
对象的UserVote
对象。可以将这些对象放入列表中并进行排序。
import 'dart:collection';
class UserVote implements Comparable<UserVote> {
final String name;
final List<int> list;
const UserVote(this.name, this.list);
@override
int compareTo(UserVote o) {
final minLength = list.length > o.list.length ? o.list.length : list.length;
for (var i = 0; i < minLength; i++) {
if (list[i] > o.list[i]) {
return -1;
} else if (list[i] < o.list[i]) {
return 1;
}
}
return o.list.length.compareTo(list.length);
}
@override
String toString() => '$name: $list';
}
void main() {
final userVotes = {
"arbourn": [1, 0, 7],
"burun": [2, 9, 0, 1],
"niko": [1, 0, 3, 10],
"niko2": [1, 0, 3, 10, 0],
};
final listOfUserVotes =
userVotes.entries.map((e) => UserVote(e.key, e.value)).toList();
listOfUserVotes.sort();
listOfUserVotes.forEach(print);
}