【发布时间】:2012-10-04 23:44:18
【问题描述】:
我在 API 文档中看到List 上有一个sort() 方法,但我不清楚它需要什么参数。当前需要进行非常简单的直接 alpha 比较。
【问题讨论】:
我在 API 文档中看到List 上有一个sort() 方法,但我不清楚它需要什么参数。当前需要进行非常简单的直接 alpha 比较。
【问题讨论】:
感谢您的提问!您可以像这样对Strings 的列表进行排序:
main() {
final List<String> fruits = <String>['bananas', 'apples', 'oranges'];
fruits.sort();
print(fruits);
}
以上代码打印:
[apples, bananas, oranges]
注意sort() 不返回值。它对列表进行排序而不创建新列表。如果要排序和打印在同一行,可以使用方法级联:
print(fruits..sort());
要获得更多控制,您可以定义自己的比较逻辑。这是一个根据价格对水果进行排序的示例。
main() {
final List<String> fruits = <String>['bananas', 'apples', 'oranges'];
fruits.sort((a, b) => getPrice(a).compareTo(getPrice(b)));
print(fruits);
}
让我们看看这里发生了什么。
List 有一个sort 方法,该方法有一个可选 参数:Comparator。比较器是typedef 或函数别名。在这种情况下,它是一个函数的别名,如下所示:
int Comparator(T a, T b)
来自文档:
Comparator 函数表示这样的总排序,如果 a 小于 b,则返回负整数,如果 a 等于 b,则返回零,如果 a 大于 b,则返回正整数。
此外,如果您创建一个由自定义对象组成的列表,您可以将 Comparable<T> 添加为 mixin 或继承 (extends),然后覆盖 compareTo 方法,以重新创建标准sort() 的行为用于您的自定义对象列表。欲了解更多信息,请查看this other, related StackOverflow answer。
【讨论】:
这是实现它的一行代码。
fruits.sort((String a, String b)=>a.compareTo(b)); //fruits is of type List<String>
【讨论】:
在赛斯的详细回答中只加一点,一般来说,在
(a, b) => foo(a, b)
传递到sort,函数foo 应该回答如下整数结果:
为了满足上述三分法,a 和 b 都必须是 Comparables。
【讨论】:
使用compareAsciiUpperCase 而不是compareTo,因为它支持字符串并自动忽略区分大小写
import "package:collection/collection.dart";
data.sort((a, b) {
return compareAsciiUpperCase(a.name, b.name);
});
https://api.flutter.dev/flutter/package-collection_collection/compareAsciiUpperCase.html
【讨论】:
给你。所有你需要知道的
用于对整数或字符串的简单列表进行排序
var list = [5 , -5 ,1];
list.sort(); //-5 , 1 , 5
用于反转列表顺序
list.reversed ;
用于按字段排序对象列表或地图
List<Map<String, dynamic>> list= [
{"name": "Shoes", "price": 100},
{"name": "Pants", "price": 50},
];
// from low to high according to price
list.sort((a, b) => ["price"].compareTo(b["price"]));
// from high to low according to price
list.sort((a, b) => b["price"].compareTo(a["price"]));
【讨论】:
今天之后,你应该可以做 list.sort() 。 sort 方法的参数现在是可选的,它默认为对元素本身调用 compareTo 的函数。由于 String 是 Comparable 的,它现在应该可以工作了。
【讨论】:
我是如何解决这个问题的。
List<Product> _dataSavingListProducts = [];
List<Product> _dataSavingListFavoritesProducts = [];
void _orderDataSavingLists() {
_dataSavingListProducts.toList().reversed;
_dataSavingListFavoritesProducts.toList().reversed;
}
【讨论】: