在 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 +10-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);