Dart 中的非变异排序列表

问题描述 投票:0回答:3

我可以在 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 显然没有这个功能,那么我自己该如何实现呢?

在寻找这个问题的答案时,我的主要困难是知道复制列表的正确方法,这并不像看起来那么明显。 我找到了答案,所以我也在下面以问答形式发布了我原来问题的答案。

sorting dart collections
3个回答
6
投票

您可以创建一个新的排序列表,而不影响原始列表,如下所示:

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]

您可以在此处阅读有关复制列表的更多信息。


1
投票

我建议您创建一个固定长度的列表。

final myList = [6, 3, 7, 1, 0, 2];
final sortedList = myList.toList(growable: false)..sort();

-1
投票

在我看来,这个问题实际上是“如何复制

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)
)。

© www.soinside.com 2019 - 2024. All rights reserved.