【问题标题】:Sorting ascending and descending in Dart?在 Dart 中升序和降序排序?
【发布时间】:2015-03-09 23:31:01
【问题描述】:

我有这个

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]

为什么这个小修改会从升序变为降序?

【问题讨论】:

    标签: sorting dart


    【解决方案1】:

    升序

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

    【讨论】:

    • 简单解决方案。谢谢
    【解决方案2】:

    更改后您实际期望发生的事情会很有趣。

    比较返回+10-1,具体取决于第二个参数是否大于第一个或0(如果它们相等)。当您交换两个参数时,+1 变为 -1,反之亦然,这将导致降序而不是升序。

    1.compareTo(2)
    

    返回-1

    print(nlist.sort((a, b) => a.compareTo(b)));
    

    按升序打印列表元素,所以是的,升序是默认值。

    【讨论】:

    • 感谢@Günter Zöchbauer。但是,它遵循的“默认”顺序是什么,+1 还是-1?我的意思是万一 (a, b) 如果它返回 1 那么我知道 a > b 那么它会将 a 放在 b 之前或 b 放在 a 之前
    • 默认顺序是(a, b)=>a.compareTo(b)。如果您不提供要排序的比较函数,这是您得到的顺序 - 它默认按此顺序使用元素自己的 compareTo 函数。这是类型本身的默认顺序,即数字的数字顺序和字符串的字典顺序。如果您需要对不是Comparable 的元素进行排序,则不能退回到compareTo,并且必须编写一个函数,如果第一个元素小于第二个元素,则返回负数,反之则返回正数, 如果元素相等则为零。
    【解决方案3】:

    升序:

    var nlist = [4,2,1,5]
    var compare = (b, a) => a.compareTo(b);
    

    降序:

    var compare = (b, a) => -a.compareTo(b);
    

    【讨论】:

    • 这是一个完美的答案!
    • @arc 答案是颠倒的。第一个将以 descending 顺序给出值,第二个将按 ascending 顺序给出值。
    【解决方案4】:

    另一种排序方式

      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]
    

    【讨论】:

    • nlist..sort(); 好像是错字?
    • .. 是 Dart 中的级联运算符,参见stackoverflow.com/questions/49447736/…
    • cascade 操作真的很有帮助,它允许将排序后的数组存储到变量中。没有级联 sort 返回 void
    【解决方案5】:

    升序

    没有必要写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 不会原地反转列表。相反,它按升序对原始列表进行排序,然后返回一个降序的iterable,而不是一个列表(即Iterable<int>,而不是List<int>)。也许这就是你想要的。如果没有,你必须做list = (list..sort()).reversed.toList();。但是,对于大型列表,list.sortReversed() 要快得多。

    • 在前面提到的 FIC 包中还有一个reversedView() 方法,它返回列表的降序视图。 “视图”意味着如果您稍后将项目添加到原始列表,则反向列表也将具有这些项目,反之亦然。因此,如果您的列表已经按升序排序,并且您希望访问降序列表而不浪费时间进行反转,只需执行以下操作:

      list.sort();
      List<int> listDescending = list.reversedView; // Very fast.
      

    免责声明:我是 FIC 包的作者。

    【讨论】:

      【解决方案6】:
      var nlist = [1, 6, 8, 2, 16, 0];
      nlist.sort((a, b) => a - b);
      

      【讨论】:

      • 最好在您的代码中添加一些解释,尤其是对于具有许多现有答案的老问题。解释不仅可以帮助读者通过复制粘贴代码来解决他们眼前的问题,还可以理解代码并能够解决类似的问题
      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2023-03-07
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      相关资源
      最近更新 更多