如何在Dart中对字符串列表进行排序?

geo*_*ler 22 sorting string list dart

我在API文档中看到有一个sort()方法List,但我不清楚参数需要什么.目前的需求是进行非常简单的直接α比较.

Set*_*add 40

谢谢你的提问!您可以像这样对字符串列表进行排序:

main() {
  var fruits = ['bananas', 'apples', 'oranges'];
  fruits.sort();
  print(fruits);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码打印:

apples, bananas, oranges
Run Code Online (Sandbox Code Playgroud)

请注意,sort()不返回值.它在不创建新列表的情况下对列表进行排序.如果要在同一行中排序和打印,可以使用方法级联:

print(fruits..sort());
Run Code Online (Sandbox Code Playgroud)

要获得更多控制,您可以定义自己的比较逻辑.以下是根据价格对水果进行分类的示例.

main() {
  var fruits = ['bananas', 'apples', 'oranges'];
  fruits.sort((a, b) => getPrice(a).compareTo(getPrice(b)));
  print(fruits);
}
Run Code Online (Sandbox Code Playgroud)

让我们看看这里发生了什么.

List有一个sort方法,它有一个可选参数:Comparator.比较器是一个typedef或函数别名.在这种情况下,它是一个函数的别名,如下所示:

int Comparator(T a, T b)
Run Code Online (Sandbox Code Playgroud)

来自文档:

如果a小于b,则比较器函数通过返回负整数来表示这样的总排序,如果a等于b则返回零,如果a大于b,则返回正整数.


Oma*_*sam 12

对于对整数或字符串的简单列表进行排序:

var list = [5 , -5 ,1];
list.sort(); //-5 , 1 , 5
Run Code Online (Sandbox Code Playgroud)

对于反转列表顺序:

list.reversed;
Run Code Online (Sandbox Code Playgroud)

对于按对象或映射的字段排序列表:

List<Map<String, dynamic>> list= [
    {"name": "Shoes", "price": 100},
    {"name": "Pants", "price": 50},
  ];

// from low to high according to price
list.sort((a, b) => a["price"].compareTo(b["price"]));
  
// from high to low according to price
list.sort((a, b) => b["price"].compareTo(a["price"]));
Run Code Online (Sandbox Code Playgroud)


Par*_*wal 9

这是实现它的一行代码。

fruits.sort((String a, String b)=>a.compareTo(b)); //fruits is of type List<String>
Run Code Online (Sandbox Code Playgroud)


loo*_*nix 9

使用compareAsciiUpperCase而不是compareTo,因为它支持字符串并自动忽略区分大小写:

import "package:collection/collection.dart";

data.sort((a, b) {
  return compareAsciiUpperCase(a.name, b.name);
});
Run Code Online (Sandbox Code Playgroud)


mez*_*oni 7

import 'package:enumerable/enumerable.dart';

void main(List<String> args) {
  var strings = ["c", "bb", "b", "cc", null, "a", 'ccc'];
  var query = strings.orderByDescending((s) => s?.length ?? 0).thenBy((s) => s);
  print(query.toList());
}
Run Code Online (Sandbox Code Playgroud)

结果:

[ccc,bb,cc,a,b,c,null]


JON*_*vas 6

仅在赛斯的详细答案中添加一点,一般来说,在

(a, b) => foo(a, b)
Run Code Online (Sandbox Code Playgroud)

传入sort,该函数foo应按如下方式回答整数结果:

  • 如果 a < b,结果应该 < 0,
  • 如果 a = b,结果应该是 = 0,并且
  • 如果 a > b,结果应该 > 0。

对于三分法的上述法律持有,两者ab必须Comparable秒。