我想通过使用另一个列表中条目的顺序作为排序参考来对字符串列表(可能有重复的条目)进行排序。所以,以下列表是我要排序的列表
List<String> list = ['apple','pear','apple','x','x','orange','x','pear'];
Run Code Online (Sandbox Code Playgroud)
指定顺序的列表是
List<String> order = ['orange','apple','x','pear'];
Run Code Online (Sandbox Code Playgroud)
输出应该是
List<String> result = ['orange','apple','apple','x','x','x','pear','pear'];
Run Code Online (Sandbox Code Playgroud)
有没有一种干净的方法可以做到这一点?
我不明白我是否可以使用列表sort
和compare
来解决以下问题。我尝试使用map
、iterable
、intersection
等。
可能有一种更有效的方法,但至少你得到了想要的结果:
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);
}
Run Code Online (Sandbox Code Playgroud)
在DartPad上尝试一下
传递给的闭包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);
}
Run Code Online (Sandbox Code Playgroud)
在DartPad上尝试一下