我有这个
var nlist = [4,2,1,5];
var compare = (a, b) => a.compareTo(b);
nlist.sort(compare);
print(nlist); // [1,2,4,5]
Run Code Online (Sandbox Code Playgroud)
在这里(其中我改变了(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]
Run Code Online (Sandbox Code Playgroud)
为什么这个小修改会从升序变为降序?
小智 53
var nlist = [1, 6, 8, 2, 16, 0]
nlist.sort((a, b) => a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)
var nlist = [1, 6, 8, 2, 16, 0]
nlist.sort((b, a) => a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)
小智 13
对于升序:
var nlist = [4,2,1,5]
var compare = (b, a) => a.compareTo(b);
Run Code Online (Sandbox Code Playgroud)
对于降序:
var compare = (b, a) => -a.compareTo(b);
Run Code Online (Sandbox Code Playgroud)
你真正期望在改变后发生的事情会很有趣.
比较收益+1,0,-1取决于第二个参数是否大于1大于或0如果他们是平等的.交换时,两个参数+1变为-1相反,反之亦然,这导致降序而不是升序.
1.compareTo(2)
Run Code Online (Sandbox Code Playgroud)
回归-1和
print(nlist.sort((a, b) => a.compareTo(b)));
Run Code Online (Sandbox Code Playgroud)
以升序打印列表元素,因此,升序是默认值.
没有必要写list.sort((a, b) => a.compareTo(b));。这有效:
list.sort();
Run Code Online (Sandbox Code Playgroud)
list.sort((a, b) => b.compareTo(a));
Run Code Online (Sandbox Code Playgroud)
或者,截至 2021 年,如果您使用https://pub.dev/packages/fast_immutable_collections(FIC 包),则此方法有效:
list.sortReversed();
Run Code Online (Sandbox Code Playgroud)
(list..sort()).reversed不会就地反转列表。相反,它按升序对原始列表进行排序,然后返回一个降序的iterable,而不是 List (即 ,Iterable<int>not List<int>)。也许这就是你想要的。如果没有,你必须这样做list = (list..sort()).reversed.toList();。然而,对于大型列表来说list.sortReversed()要快得多。
在前面提到的FIC包中还有一个reversedView()方法,它返回列表的降序视图。“视图”意味着如果您稍后将项目添加到原始列表中,则反向列表中也会包含这些项目,反之亦然。因此,如果您的列表已经按升序排序,并且您希望访问降序列表而不浪费时间进行反转,只需执行以下操作:
list.sort();
List<int> listDescending = list.reversedView; // Very fast.
Run Code Online (Sandbox Code Playgroud)
免责声明:我是 FIC 包的作者。
另一种排序方式
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]
Run Code Online (Sandbox Code Playgroud)