flutter - 有没有办法按字符串中的数字对字符串列表进行排序?
问题描述
有没有办法对类似的东西进行排序:
List<String> hi = ['1hi', '2hi','5hi', '3hi', '4hi'];
到这个?
['1hi', '2hi','3hi', '4hi', '5hi']
解决方案
仅调用List<String>.sort()
本身就会进行字典排序。也就是说,您的字符串将按字符代码顺序排序,并且'10'
将在'2'
. 这通常不是预期的。
如果您的数字具有前导0
s 以确保所有数字具有相同的位数,则字典排序将起作用。但是,如果位数是可变的,则需要解析数字的值以进行排序。更通用的方法是提供一个回调来.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);
}
推荐阅读
- elasticsearch - 嵌套 agg 桶上的 Bucket_selector 不起作用
- performance - VSCode 语义着色性能
- java - Firestore 数据无法在 RecyclerView 上显示
- python - 如何根据数据中的类别将图例放在熊猫数据框中的散点图上?
- sql - PostgreSQL - 如何使用 WHERE 获得 0 值?
- javascript - 在应用程序中打开应用程序时调用什么,我该如何设置它的样式?
- android - 使用键盘android对焦时如何设置材质按钮的背景?
- javascript - 未捕获(承诺中)TypeError:无法读取未定义的属性'functionName'
- laravel - Trix editor 为什么工具栏在编辑器模糊时消失?
- python - 按类别评估累积总和并在新的一天开始时重置