我想通过使用另一个列表中条目的顺序作为排序参考来对字符串列表(可能重复的条目)进行排序。因此,以下列表是我要排序的列表
List<String> list = ['apple','pear','apple','x','x','orange','x','pear'];
指定订单的列表是
List<String> order = ['orange','apple','x','pear'];
输出应为
List<String> result = ['orange','apple','apple','x','x','x','pear','pear'];
这样做有干净的方法吗?
我不明白我是否可以使用列表的sort
和compare
来解决以下问题。我尝试使用map
,iterable
,intersection
等
答案 0 :(得分:2)
可能有一种更有效的方法,但至少可以获得所需的结果:
main() {
List<String> list = ['apple','pear','apple','x','x','orange','x','pear'];
List<String> order = ['orange','apple','x','pear'];
list.sort((a, b) => order.indexOf(a).compareTo(order.indexOf(b)));
print(list);
}
上试用
传递给list.sort(...)
的闭包是一个自定义比较器,它不是比较传递的项目,而是比较它们在order
中的位置并返回结果。
使用地图获得更好的查找效果:
main() {
List<String> list = ['apple','pear','apple','x','x','orange','x','pear'];
List<String> orderList = ['orange','apple','x','pear'];
Map<String,int> order = new Map.fromIterable(
orderList, key: (key) => key, value: (key) => orderList.indexOf(key));
list.sort((a, b) => order[a].compareTo(order[b]));
print(list);
}
上试用
答案 1 :(得分:0)
通过LINQ风格。
import 'package:queries/collections.dart';
void main() {
var data =
Collection(['apple', 'pear', 'apple', 'x', 'x', 'orange', 'x', 'pear']);
var keys = Collection(['orange', 'apple', 'x', 'pear']);
var q = keys
.select((key) => data.where((elem) => elem == key))
.selectMany((e) => e);
print(q.toList());
}
结果
[orange, apple, apple, x, x, x, pear, pear]
算法
-选择每个键
-根据所选键选择部分数据
-展平结果
另一种方式(加入):
import 'package:queries/collections.dart';
void main() {
var data =
Collection(['apple', 'pear', 'apple', 'x', 'x', 'orange', 'x', 'pear']);
var keys = Collection(['orange', 'apple', 'x', 'pear']);
//
var q = keys.join(data, (k) => k, (d) => d, (k, d) => d);
print(q.toList());
}
结果:
[orange, apple, apple, x, x, x, pear, pear]