【问题标题】:Is there a way to sort string lists by numbers inside of the strings?有没有办法按字符串中的数字对字符串列表进行排序?
【发布时间】:2022-02-14 14:11:48
【问题描述】:

有没有办法对类似的东西进行排序:

List<String> hi = ['1hi', '2hi','5hi', '3hi', '4hi'];

这个?

['1hi', '2hi','3hi', '4hi', '5hi']

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    只需调用List&lt;String&gt;.sort() 本身就会调用lexicographic sort。也就是说,您的字符串将按字符代码顺序排序,而'10' 将排在'2' 之前。这通常不是预期的。

    字典排序将起作用如果您的数字有前导 0s 以确保所有数字具有相同的位数。但是,如果位数是可变的,则需要解析数字的值以进行排序。一种更通用的方法是向.sort() 提供回调,告诉它如何确定两个项目的相对顺序。

    幸运的是,package:collection 有一个 compareNatural 函数可以为您执行此操作:

    import 'package:collection/collection.dart';
    
    List<String> hi = ['1hi', '2hi','5hi', '3hi', '4hi'];
    hi.sort(compareNatural);
    

    如果你的情况有点复杂,compareNatural 没有做你想做的事,更通用的方法是让.sort() 回调自己解析,例如通过正则表达式:

    /// Returns the integer prefix from a string.
    ///
    /// Returns null if no integer prefix is found.
    int parseIntPrefix(String s) {
      var re = RegExp(r'(-?[0-9]+).*');
      var match = re.firstMatch(s);
      if (match == null) {
        return null;
      }
      return int.parse(match.group(1));
    }
    
    int compareIntPrefixes(String a, String b) {
      var aValue = parseIntPrefix(a);
      var bValue = parseIntPrefix(b);
      if (aValue != null && bValue != null) {
        return aValue - bValue;
      }
    
      if (aValue == null && bValue == null) {
        // If neither string has an integer prefix, sort the strings lexically.
        return a.compareTo(b);
      }
    
      // Sort strings with integer prefixes before strings without.
      if (aValue == null) {
        return 1;
      } else {
        return -1;
      }
    }
    
    void main() {
      List<String> hi = ['1hi', '2hi','5hi', '3hi', '4hi'];
      hi.sort(compareIntPrefixes);
    }
    

    【讨论】:

    • hi.sort(compareNatural); 拯救了我的一天!
    • @MutluSimsek 同样!非常适合 8a、8b、9、10、10a、11 等地址
    【解决方案2】:

    您可以像这样对列表进行排序:

    hi.sort();
    

    (因为在其实现中数字排在字母之前)

    【讨论】:

    • 哇,谢谢!我是飞镖新手,所以我认为它会更复杂,哈哈。
    • 如果有大于或等于 10 的数字,这可能不会达到您的预期。
    猜你喜欢
    • 2018-07-02
    • 2021-06-10
    • 2014-07-30
    • 1970-01-01
    • 2012-04-03
    • 2022-11-25
    • 2011-11-29
    • 2017-11-30
    • 2017-08-11
    相关资源
    最近更新 更多