我可以在 Dart 中对列表进行排序:
final myList = [6, 3, 7, 1, 0, 2];
myList.sort();
然而,这是一种破坏性的排序,因为它会就地改变它。我想做这样的事情:
final myList = [6, 3, 7, 1, 0, 2];
final newList = myList.sorted();
我的列表保持不变,但
newList
包含排序后的列表。 Dart 显然没有这个功能,那么我自己该如何实现呢?
在寻找这个问题的答案时,我的主要困难是知道复制列表的正确方法,这并不像看起来那么明显。 我找到了答案,所以我也在下面以问答形式发布了我原来问题的答案。
您可以创建一个新的排序列表,而不影响原始列表,如下所示:
final myList = [6, 3, 7, 1, 0, 2];
final sorted = myList.toList()..sort();
调用
toList()
会复制列表。 ..
是获取对列表本身的引用,因为 sort()
是一个 void 函数。这给出了相同的结果:
final sorted = myList.toList();
sorted.sort();
打印两个列表的值会得到以下结果:
print(myList); // [6, 3, 7, 1, 0, 2]
print(sorted); // [0, 1, 2, 3, 6, 7]
您可以在此处阅读有关复制列表的更多信息。
我建议您创建一个固定长度的列表。
final myList = [6, 3, 7, 1, 0, 2];
final sortedList = myList.toList(growable: false)..sort();
在我看来,这个问题实际上是“如何复制
List
?”,因为之后您可以对副本进行简单的变异排序。
有多种方法可以将
Iterable
复制到新的 List
:
Iterable
:iterable.toList()
List
构造函数:List.of(iterable)
List
文字中使用扩展运算符:[...iterable]
。请注意,这总是会创建一个可增长的 List
。请注意,不应使用
List.from
,因为它使用 dynamic
类型并丢失类型信息。 Effective Dart 更喜欢 .toList()
。
另请注意,上述内容也适用于
Set
(iterable.toSet()
、{...iterable}
、Set.of(iterable)
)。