How can I sort a list of strings in Dart?

2020-02-10 00:58发布

问题:

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 Comparables.



回答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.