在 Dart 中升序和降序排序?
Sorting ascending and descending in Dart?
我有这个
var nlist = [4,2,1,5];
var compare = (a, b) => a.compareTo(b);
nlist.sort(compare);
print(nlist); // [1,2,4,5]
和此处(我将 (b, a)
更改为 (a, b)
)
var nlist = [4,2,1,5]
var compare = (b, a) => a.compareTo(b);
nlist.sort(compare);
print(nlist); // [5,4,2,1]
为什么这个小修改从升序变为降序?
您实际期望更改后发生的事情会很有趣。
比较 returns +1
、0
、-1
取决于第二个参数是否大于第一个或 0
如果它们相等。当您交换两个参数时,+1
变为 -1
,反之亦然,这会导致降序而不是升序。
1.compareTo(2)
returns -1
和
print(nlist.sort((a, b) => a.compareTo(b)));
按升序打印列表元素,所以是的,升序是默认值。
另一种排序方式
var nlist = [4,2,1,5];
var ascending = nlist..sort();
var descending = ascending.reversed;
print(ascending); // [1, 2, 4, 5]
print(descending); // [5, 4, 2, 1]
升序:
var nlist = [4,2,1,5]
var compare = (b, a) => a.compareTo(b);
降序:
var compare = (b, a) => -a.compareTo(b);
升序
var nlist = [1, 6, 8, 2, 16, 0]
nlist.sort((a, b) => a.compareTo(b));
下降
var nlist = [1, 6, 8, 2, 16, 0]
nlist.sort((b, a) => a.compareTo(b));
升序
不用写list.sort((a, b) => a.compareTo(b));
。这有效:
list.sort();
下降
list.sort((a, b) => b.compareTo(a));
或者,从 2021 年开始,如果您使用 https://pub.dev/packages/fast_immutable_collections(FIC 包),则此方法有效:
list.sortReversed();
备注:
(list..sort()).reversed
不会原地反转列表。相反,它按升序对原始列表进行排序,然后 returns 降序 iterable,而不是列表(即 Iterable<int>
,而不是 List<int>
).也许这就是你想要的。如果没有,你必须做list = (list..sort()).reversed.toList();
。但是,对于大型列表,list.sortReversed()
要快得多。
前面提到的FIC包中还有一个reversedView()
方法,即returns列表的降序VIEW。 “视图”意味着如果您稍后将项目添加到原始列表,则反向列表也将包含这些项目,反之亦然。因此,如果您的列表已经按升序排序,并且您想访问降序列表而不浪费时间进行反转,只需执行:
list.sort();
List<int> listDescending = list.reversedView; // Very fast.
免责声明:我是FIC包的作者
var nlist = [1, 6, 8, 2, 16, 0];
nlist.sort((a, b) => a - b);
我有这个
var nlist = [4,2,1,5];
var compare = (a, b) => a.compareTo(b);
nlist.sort(compare);
print(nlist); // [1,2,4,5]
和此处(我将 (b, a)
更改为 (a, b)
)
var nlist = [4,2,1,5]
var compare = (b, a) => a.compareTo(b);
nlist.sort(compare);
print(nlist); // [5,4,2,1]
为什么这个小修改从升序变为降序?
您实际期望更改后发生的事情会很有趣。
比较 returns +1
、0
、-1
取决于第二个参数是否大于第一个或 0
如果它们相等。当您交换两个参数时,+1
变为 -1
,反之亦然,这会导致降序而不是升序。
1.compareTo(2)
returns -1
和
print(nlist.sort((a, b) => a.compareTo(b)));
按升序打印列表元素,所以是的,升序是默认值。
另一种排序方式
var nlist = [4,2,1,5];
var ascending = nlist..sort();
var descending = ascending.reversed;
print(ascending); // [1, 2, 4, 5]
print(descending); // [5, 4, 2, 1]
升序:
var nlist = [4,2,1,5]
var compare = (b, a) => a.compareTo(b);
降序:
var compare = (b, a) => -a.compareTo(b);
升序
var nlist = [1, 6, 8, 2, 16, 0]
nlist.sort((a, b) => a.compareTo(b));
下降
var nlist = [1, 6, 8, 2, 16, 0]
nlist.sort((b, a) => a.compareTo(b));
升序
不用写list.sort((a, b) => a.compareTo(b));
。这有效:
list.sort();
下降
list.sort((a, b) => b.compareTo(a));
或者,从 2021 年开始,如果您使用 https://pub.dev/packages/fast_immutable_collections(FIC 包),则此方法有效:
list.sortReversed();
备注:
(list..sort()).reversed
不会原地反转列表。相反,它按升序对原始列表进行排序,然后 returns 降序 iterable,而不是列表(即Iterable<int>
,而不是List<int>
).也许这就是你想要的。如果没有,你必须做list = (list..sort()).reversed.toList();
。但是,对于大型列表,list.sortReversed()
要快得多。前面提到的FIC包中还有一个
reversedView()
方法,即returns列表的降序VIEW。 “视图”意味着如果您稍后将项目添加到原始列表,则反向列表也将包含这些项目,反之亦然。因此,如果您的列表已经按升序排序,并且您想访问降序列表而不浪费时间进行反转,只需执行:list.sort(); List<int> listDescending = list.reversedView; // Very fast.
免责声明:我是FIC包的作者
var nlist = [1, 6, 8, 2, 16, 0];
nlist.sort((a, b) => a - b);