如何调整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] }
逻辑说明
- 同内容大小写处理:当两个字符串小写内容相同时,确保小写形式的字符串排在大写形式前面(如
v在V前)。 - 跨开头大小写的特殊排序:当一个是小写开头、另一个是大写开头时,如果小写开头字符串的小写内容更大(如
another的小写another>And的小写and),则让小写开头的字符串排在前面;反之则按正常小写字典序排序(如And的小写and<bb的小写bb,所以And排在bb前)。 - 同开头大小写的正常排序:当两个字符串都是小写或都是大写开头时,直接按不区分大小写的字典序排序。
内容的提问来源于stack exchange,提问作者Arbiter Chil
相关产品推荐
相关产品推荐

