根据其他列表的排序方式在Dart中对列表进行排序

时间:2019-07-26 18:35:19

标签: algorithm sorting flutter dart

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

List<String> a = ["a", "b", "c"];
List<int> b = [2, 3, 1];

现在,我希望结果像这样

a = ["c", "a", "b"];
b = [1, 2, 3];

如何获得此结果?

1 个答案:

答案 0 :(得分:1)

您可以通过创建一个Map来实现此目的,该2包含字母到您的数字的映射,即a分配了3b拥有{{ 1}}等。
现在,您可以正常地对列表进行排序,然后根据排序之前存储的映射重新创建其他列表:

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]
}

在此示例中,我将收集用于。 Dart 2.3中引入了集合文字的语法。
Learn more

您可以轻松地将其转过来,然后将数字映射到您的字母。看起来像这样:

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]
}

注意,在此我还通过转过compareTo对字母进行了降序排列(默认情况下,a.compareTo(b)List.sort