You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整Dart列表排序规则,实现小写优先的字母序排列?

Dart 自定义排序实现预期结果

要实现你期望的排序逻辑,我们需要自定义一个比较器,核心是在不区分大小写排序的基础上,针对小写开头且小写字典序更大的字符串,让它们排在大写开头且小写字典序更小的字符串前面,同时保持同大小写开头字符串的正常字典序,以及小写与大写同内容字符串的顺序(小写在前)。

实现代码

void main() {
  List<String> list = ["a", "an", "And", "another", "B", "bb", "v", "V"];
  
  // 自定义比较器
  int customSort(String a, String b) {
    String aLower = a.toLowerCase();
    String bLower = b.toLowerCase();
    
    // 处理小写内容相同的情况:小写字符串排在大写前面
    if (aLower == bLower) {
      bool aIsLower = a[0].toLowerCase() == a[0];
      bool bIsLower = b[0].toLowerCase() == b[0];
      if (aIsLower && !bIsLower) return -1;
      if (!aIsLower && bIsLower) return 1;
      return 0;
    }
    
    int lowerCompare = aLower.compareTo(bLower);
    bool aStartsLower = a[0].toLowerCase() == a[0];
    bool bStartsLower = b[0].toLowerCase() == b[0];
    
    // 处理一方小写开头、另一方大写开头的特殊情况
    if (aStartsLower != bStartsLower) {
      // 当小写内容更大的是小写开头时,让它排在前面
      if (lowerCompare > 0) {
        return aStartsLower ? -1 : 1;
      }
      // 否则按正常小写字典序排序
      return lowerCompare;
    }
    
    // 同开头大小写的字符串,按正常小写字典序排序
    return lowerCompare;
  }
  
  list.sort(customSort);
  print(list); // 输出: [a, an, another, And, bb, B, v, V]
}

逻辑说明

  1. 同内容大小写处理:当两个字符串小写内容相同时,确保小写形式的字符串排在大写形式前面(如v在V前)。
  2. 跨开头大小写的特殊排序:当一个是小写开头、另一个是大写开头时,如果小写开头字符串的小写内容更大(如another的小写another > And的小写and),则让小写开头的字符串排在前面;反之则按正常小写字典序排序(如And的小写and < bb的小写bb,所以And排在bb前)。
  3. 同开头大小写的正常排序:当两个字符串都是小写或都是大写开头时,直接按不区分大小写的字典序排序。

内容的提问来源于stack exchange,提问作者Arbiter Chil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:13:09