根据另一个列表的排序方式对 Dart 中的列表进行排序

use*_*335 3 sorting algorithm dart flutter

我正在尝试参考另一个列表对列表进行排序。考虑这个例子,

List<String> a = ["a", "b", "c"];
List<int> b = [2, 3, 1];
Run Code Online (Sandbox Code Playgroud)

现在,我希望结果是这样的,

a = ["c", "a", "b"];
b = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

我怎样才能达到这个结果?

cre*_*not 5

您可以通过创建一个Map保存字母到您的数字的映射来实现这一点,2即已a分配给它,3拥有b等。
现在您可以正常排序您的列表,然后根据您在排序之前存储的映射重新创建您的其他列表:

main() {
  List<String> letters = ["a", "b", "c"];
  final List<int> numbers = [2, 3, 1];

  final Map<int, String> mappings = {
    for (int i = 0; i < numbers.length; i++)
      numbers[i]: letters[i]
  };

  numbers.sort();

  letters = [
    for (int number in numbers) mappings[number]
  ];

  print(letters); // [c, a, b]
  print(numbers); // [1, 2, 3]
}
Run Code Online (Sandbox Code Playgroud)

我在这个例子中使用了集合。这种集合文字的语法是在 Dart 中引入的2.3
了解更多

您可以轻松地将其转换为将数字映射到您的字母。那看起来像这样:

main() {
  final List<String> letters = ["a", "b", "c"];
  List<int> numbers = [2, 3, 1];

  final Map<String, int> mapping = {
    for (int i = 0; i < letters.length; i++)
      letters[i]: numbers[i]
  };

  letters.sort((a, b) => b.compareTo(a));

  numbers = [
    for (String letter in letters) mapping[letter]
  ];

  print(letters); // [c, b, a]
  print(numbers); // [1, 3, 2]
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里也通过旋转以降序对字母进行了排序compareTo(默认情况下a.compareTo(b)由 使用List.sort)。