I see in the API docs there is a sort()
method on List
, but I'm not clear what it needs for a parameter. The current need is for a very simple straight up alpha comparison.
问题:
回答1:
Thanks for the question! You can sort a list of Strings like this:
main() {
var fruits = ['bananas', 'apples', 'oranges'];
fruits.sort();
print(fruits);
}
The above code prints:
apples, bananas, oranges
Notice that sort()
does not return a value. It sorts the list without creating a new list. If you want to sort and print in the same line, you can use method cascades:
print(fruits..sort());
For more control, you can define your own comparison logic. Here is an example of sorting the fruits based on price.
main() {
var fruits = ['bananas', 'apples', 'oranges'];
fruits.sort((a, b) => getPrice(a).compareTo(getPrice(b)));
print(fruits);
}
Let's see what's going on here.
A List has a sort method, which has one optional parameter: a Comparator. A Comparator is a typedef
or function alias. In this case, it's an alias for a function that looks like:
int Comparator(T a, T b)
From the docs:
A Comparator function represents such a total ordering by returning a negative integer if a is smaller than b, zero if a is equal to b, and a positive integer if a is greater than b.
回答2:
Here is the one line code to achieve it.
fruits.sort((String a, String b)=>a.compareTo(b)); //fruits is of type List<String>
回答3:
To add just one point to Seth's detailed answer, in general, in
(a, b) => foo(a, b)
passed into sort
, the function foo
should answer an integer result as follows:
- if a < b, result should be < 0,
- if a = b, result should be = 0, and
- if a > b, result should be > 0.
For the above law of trichotomy to hold, both a
and b
must be Comparable
s.
回答4:
After today, you should just be able to do list.sort() . The sort method's argument is now optional, and it defaults to a function that calls compareTo on the elements themselves. Since String is Comparable, it should Just Work now.