【问题标题】:How can I sort a list of strings in Dart?如何在 Dart 中对字符串列表进行排序?
【发布时间】:2012-10-04 23:44:18
【问题描述】:

我在 API 文档中看到List 上有一个sort() 方法,但我不清楚它需要什么参数。当前需要进行非常简单的直接 alpha 比较。

【问题讨论】:

    标签: string list sorting dart


    【解决方案1】:

    1。快速解决方案

    感谢您的提问!您可以像这样对Strings 的列表进行排序:

    main() {
      final List<String> fruits = <String>['bananas', 'apples', 'oranges'];
      fruits.sort();
      print(fruits);
    }
    

    以上代码打印:

    [apples, bananas, oranges]
    

    2。稍微高级一点的用法

    注意sort() 不返回值。它对列表进行排序而不创建新列表。如果要排序和打印在同一行,可以使用方法级联

    print(fruits..sort());
    

    要获得更多控制,您可以定义自己的比较逻辑。这是一个根据价格对水果进行排序的示例。

    main() {
      final List<String> fruits = <String>['bananas', 'apples', 'oranges'];
      fruits.sort((a, b) => getPrice(a).compareTo(getPrice(b)));
      print(fruits);
    }
    

    让我们看看这里发生了什么。

    List 有一个sort 方法,该方法有一个可选 参数:Comparator。比较器是typedef 或函数别名。在这种情况下,它是一个函数的别名,如下所示:

    int Comparator(T a, T b)
    

    来自文档:

    Comparator 函数表示这样的总排序,如果 a 小于 b,则返回负整数,如果 a 等于 b,则返回零,如果 a 大于 b,则返回正整数。

    3。如何使用自定义对象列表来做到这一点

    此外,如果您创建一个由自定义对象组成的列表,您可以将 Comparable&lt;T&gt; 添加为 mixin 或继承 (extends),然后覆盖 compareTo 方法,以重新创建标准sort() 的行为用于您的自定义对象列表。欲了解更多信息,请查看this other, related StackOverflow answer

    【讨论】:

    • 谢谢!很抱歉抱怨,但当我试图欣赏上述明显的多功能性时,我发现它并不直观或与以前的语言经验相一致。你们有没有一个长着方形木鼠标和长长的灰色胡须的人想出一些这样的东西? :)
    • 这是一件奇怪的历史文物。比较器应该是可选的。以前是这样,但我们不久前更改了可选参数语法,这迫使我们在一段时间内将所有参数设为非可选参数,包括这个参数。我们只是没有机会解决这个问题并再次使其成为可选。
    • 感谢@munificent 很高兴听到它很快就会得到修复。见错误code.google.com/p/dart/issues/detail?id=1235
    • 我已经根据新的 API 更新了答案。现在简单多了:)
    【解决方案2】:

    这是实现它的一行代码。

    fruits.sort((String a, String b)=>a.compareTo(b)); //fruits is of type List<String>
    

    【讨论】:

      【解决方案3】:

      在赛斯的详细回答中只加一点,一般来说,在

      (a, b) => foo(a, b)
      

      传递到sort,函数foo 应该回答如下整数结果:

      • 如果a
      • 如果 a = b,则结果应为 = 0,并且
      • 如果 a > b,结果应该 > 0。

      为了满足上述三分法,ab 都必须是 Comparables。

      【讨论】:

        【解决方案4】:

        使用compareAsciiUpperCase 而不是compareTo,因为它支持字符串并自动忽略区分大小写

        import "package:collection/collection.dart";
        
        
        data.sort((a, b) {
          return compareAsciiUpperCase(a.name, b.name);
        });
        

        https://api.flutter.dev/flutter/package-collection_collection/compareAsciiUpperCase.html

        【讨论】:

          【解决方案5】:

          给你。所有你需要知道的

          用于对整数或字符串的简单列表进行排序

          var list = [5 , -5 ,1];
           list.sort(); //-5 , 1 , 5
          

          用于反转列表顺序

          list.reversed ;
          

          用于按字段排序对象列表或地图

          List<Map<String, dynamic>> list= [
              {"name": "Shoes", "price": 100},
              {"name": "Pants", "price": 50},
            ];
          
            // from low to high according to price
            list.sort((a, b) => ["price"].compareTo(b["price"]));
            
          
            // from high to low according to price
            list.sort((a, b) => b["price"].compareTo(a["price"]));
           
          

          【讨论】:

            【解决方案6】:

            今天之后,你应该可以做 list.sort() 。 sort 方法的参数现在是可选的,它默认为对元素本身调用 compareTo 的函数。由于 String 是 Comparable 的,它现在应该可以工作了。

            【讨论】:

            • List sort() 方法是否被固定为不需要比较器函数?还是有回归?我在 Ubuntu 12.04 上使用 Dart 0.2.6.0_r15355 并得到以下结果: [3,1,2].sort()==null 和 ['a','c','b'].sort() ==null。
            • 糟糕! Dart 正在对数组进行排序:-) 但是 sort() 函数返回 void:-( 所以 "print([3,1,2].sort())'" 输出 "null"。在这种情况下,Dart 开发人员是没有实现流畅的编程风格。我希望他们会这样做。因为那样你可以立即使用调用 sort() 的结果。
            【解决方案7】:

            我是如何解决这个问题的。

            
              List<Product> _dataSavingListProducts = [];
              List<Product> _dataSavingListFavoritesProducts = [];
            
              void _orderDataSavingLists() {
                _dataSavingListProducts.toList().reversed;
                _dataSavingListFavoritesProducts.toList().reversed;
              }
            
            
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-09-07
              • 2019-06-02
              • 2018-10-22
              • 1970-01-01
              • 1970-01-01
              • 2015-03-26
              相关资源
              最近更新 更多