如何按另一个列表对列表进行排序
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按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序