如何使用Dart内置方法对多维数组按价格排序?
Dart多维列表排序与混合类型问题解答
一、混合类型列表的可行性
Dart里允许用List<dynamic>存储不同类型的元素(比如你示例里的整数价格和字符串名称),但这种做法类型不安全——编译器没法帮你检查类型,后续操作如果搞错类型很容易抛出运行时错误。
另外注意你代码里的一个bug:初始化时row = 4,生成的列表长度是4,索引范围是0-3,但后面却访问array[4],这会直接触发越界错误,得把row改成5或者去掉最后一组数据。
二、按价格排序的实现
Dart的List自带内置的sort()方法,完全不用自己写排序逻辑。你只需要给sort()传一个比较函数,用来定义两个元素的排序规则。
修正后的完整代码示例
void main() { int row = 5; // 修正row值,对应5组数据 int col = 2; // 实际只用到2列,没必要设4 var array = List.generate(row, (i) => List<dynamic>(col), growable: false); // 填充数据 array[0][0] = 12; array[0][1] = "apple"; array[1][0] = 10; array[1][1] = "drink"; array[2][0] = 15; array[2][1] = "orange"; array[3][0] = 8; array[3][1] = "chocolate bar"; array[4][0] = 0; array[4][1] = "nut"; // 按价格升序排序 array.sort((a, b) => a[0].compareTo(b[0])); // 打印结果验证 for (var item in array) { print("价格: ${item[0]}, 商品: ${item[1]}"); } }
代码说明
array.sort((a, b) => a[0].compareTo(b[0])):比较函数拿两个子列表的第一个元素(价格)对比,compareTo方法会返回负数、零、正数,分别对应a排在b前面、相等、a排在b后面,默认是升序。- 如果要降序排序,只需要把a和b反过来:
array.sort((a, b) => b[0].compareTo(a[0]))。
更优建议
其实这种“[价格, 商品名]”的结构,用自定义类会比多维列表更清晰、更安全,比如:
class Product { final int price; final String name; Product(this.price, this.name); } void main() { var products = [ Product(12, "apple"), Product(10, "drink"), Product(15, "orange"), Product(8, "chocolate bar"), Product(0, "nut"), ]; products.sort((a, b) => a.price.compareTo(b.price)); for (var p in products) { print("价格: ${p.price}, 商品: ${p.name}"); } }
这样不仅类型安全,代码可读性也更高,后续扩展属性(比如库存、分类)也更方便。
内容的提问来源于stack exchange,提问作者Abhiram
相关产品推荐
相关产品推荐

