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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用另一个列表中的项目顺序对字符串列表进行排序?相关的知识,希望对你有一定的参考价值。

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

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'];

这样做有干净的方法吗?

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

答案

可能有一种更有效的方法,但至少可以获得所需的结果:

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);
}

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);
}

DartPad上尝试一下

另一答案

通过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]

以上是关于如何使用另一个列表中的项目顺序对字符串列表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一个列表中元组元素的顺序对元组列表进行排序?

excel:根据另一列中的顺序对十进制值列表进行排序

如何根据另一个数组的顺序对对象数组进行排序?

根据另一个列表中的值对列表进行排序

如何允许用户重新排序列表中的项目?

在 Java 中,如何根据另一个列表对一个列表进行排序?