如何使用另一个列表中项目的顺序对字符串列表进行排序?

Lym*_*ymp 4 sorting dart

我想通过使用另一个列表中条目的顺序作为排序参考来对字符串列表(可能有重复的条目)进行排序。所以,以下列表是我要排序的列表

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)

有没有一种干净的方法可以做到这一点?

我不明白我是否可以使用列表sortcompare来解决以下问题。我尝试使用mapiterableintersection等。

Gün*_*uer 6

可能有一种更有效的方法,但至少你得到了想要的结果:

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上尝试一下

  • 好的解决方案。如果性能变得太差(如果“order”是一个很长的列表),您应该首先构建一个“Map”作为字符串映射到其索引,并使用它代替“of indexOf”。 (2认同)