如何按另一个列表对列表进行排序

Posted

技术标签:

【中文标题】如何按另一个列表对列表进行排序【英文标题】:How to sort a list by another list 【发布时间】:2021-01-23 21:19:37 【问题描述】:

如何对包含对象的列表进行排序,以便对象的属性与 dart 中的不同列表匹配?

class Example 
  String _id;
  String get id => _id;


List examples = [Example(id: 'hey'), Example(id: 'foo'), Example(id: 'baa')]
List ids = ['foo', 'baa', 'hey']

print(examples.sortBy(ids)) ???????


OUTPUT:

  [Example(id: 'foo'), Example(id: 'baa'), Example(id: 'hey')]

【问题讨论】:

您可以将ids 的列表映射到Examples 的列表,而不是排序 【参考方案1】:

这不是最高效的方式,但它可能是最简单的方式之一。使用基于对象字段在另一个数组中的位置进行排序的排序方法:

final sortedExamples = List.from(examples)
  ..sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));

这种方式稍微复杂一些,但性能更高,因为您只需对每个列表进行一次迭代。它涉及从您的列表中制作一张地图,然后使用它作为事实来源来重建一个排序列表:

final ref = Map.fromIterable(examples, key: (e) => e.id, value: (e) => e);
final sortedExamples = List.from(ids.map((id) => ref[id]));

如果空间有问题,第一种选择更好,如果速度有问题,第二种选择更好。

【讨论】:

太棒了!我每天都从@Abion47 的回答中学到新东西。

以上是关于如何按另一个列表对列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

将一个列表按另一个排序

Java按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序

按属性排序列表,然后按另一个

C# LINQ 组按属性集合,然后按列表定义的显式顺序对每个组进行排序[重复]

PHP按另一个数组中的特定键对数组进行排序[重复]

如何在Scala中按另一个列表拆分列表