在Dart中升序和降序排序?

use*_*121 4 sorting dart

我有这个

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)

  • 简单的解决方案。谢谢 (2认同)

小智 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)

  • @arc 答案是颠倒的。第一个将以**降序**顺序给出值,第二个将以**升序**顺序给出值。 (4认同)

Gün*_*uer 9

你真正期望在改变后发生的事情会很有趣.

比较收益+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)

以升序打印列表元素,因此,升序是默认值.

  • 默认顺序是`(a,b)=> a.compareTo(b)`.如果你没有提供比较函数来排序,那么这就是你得到的顺序 - 它默认使用元素自己的`compareTo`函数.这是类型本身的默认顺序,即数字上的数字顺序和字符串上的词典顺序.如果你需要对那些不是"Comparable"的元素进行排序,你就不能回到`compareTo`,并且必须编写一个函数,如果第一个元素小于第二个元素,则返回负数,如果是相反的话,则返回正数,如果元素相等则为零. (2认同)

Mar*_*rcG 8

对于上升

没有必要写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 包的作者。


Szc*_*ski 6

另一种排序方式

  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)

  • .. 是 Dart 中的级联运算符,请参阅 /sf/ask/3461341551/ (2认同)