Flutter 排序2相关dart数组

Flutter 排序2相关dart数组,flutter,dart,Flutter,Dart,我有两个数组 ids=[GEORGE, RUSTY, RIYAZAT, JAMES PAWNED]; avgscore=[10, 13, 3, 40]; 我希望结果数组按wrt分数的降序排序 两个数组都应该进行相应的排序,结果应该是这样的 ids should be sorted as [40, 13, 10, 3]; avgscore should be sorted as [JAMES PAWNED, RUSTY, GEORGE, RIYAZAT]; 您应该创建一个将两个数据绑定在一起的

我有两个数组

ids=[GEORGE, RUSTY, RIYAZAT, JAMES PAWNED];
avgscore=[10, 13, 3, 40];
我希望结果数组按wrt分数的降序排序 两个数组都应该进行相应的排序,结果应该是这样的

ids should be sorted as [40, 13, 10, 3];
avgscore should be sorted as [JAMES PAWNED, RUSTY, GEORGE, RIYAZAT];

您应该创建一个将两个数据绑定在一起的类。然后,可以根据
avgscore
值轻松排序:

class Person {
  final String id;
  final int avgscore;
  Person(this.id, this.avgscore);

  @override
  String toString() => '$id = $avgscore';
}

void main() {
  var ids = ['GEORGE', 'RUSTY', 'RIYAZAT', 'JAMES PAWNED'];
  var avgscore = [10, 13, 3, 40];

  final persons = List.generate(ids.length, (i) => Person(ids[i], avgscore[i]));
  print(persons); // [GEORGE = 10, RUSTY = 13, RIYAZAT = 3, JAMES PAWNED = 40]

  persons.sort((p1, p2) => p2.avgscore.compareTo(p1.avgscore));

  print(persons); // [JAMES PAWNED = 40, RUSTY = 13, GEORGE = 10, RIYAZAT = 3]

  // If you need to split the values into two arrays again
  ids = persons.map((p) => p.id).toList();
  avgscore = persons.map((p) => p.avgscore).toList();

  print(ids); // [JAMES PAWNED, RUSTY, GEORGE, RIYAZAT]
  print(avgscore); // [40, 13, 10, 3]
}

您应该创建一个将两个数据绑定在一起的类。然后,可以根据
avgscore
值轻松排序:

class Person {
  final String id;
  final int avgscore;
  Person(this.id, this.avgscore);

  @override
  String toString() => '$id = $avgscore';
}

void main() {
  var ids = ['GEORGE', 'RUSTY', 'RIYAZAT', 'JAMES PAWNED'];
  var avgscore = [10, 13, 3, 40];

  final persons = List.generate(ids.length, (i) => Person(ids[i], avgscore[i]));
  print(persons); // [GEORGE = 10, RUSTY = 13, RIYAZAT = 3, JAMES PAWNED = 40]

  persons.sort((p1, p2) => p2.avgscore.compareTo(p1.avgscore));

  print(persons); // [JAMES PAWNED = 40, RUSTY = 13, GEORGE = 10, RIYAZAT = 3]

  // If you need to split the values into two arrays again
  ids = persons.map((p) => p.id).toList();
  avgscore = persons.map((p) => p.avgscore).toList();

  print(ids); // [JAMES PAWNED, RUSTY, GEORGE, RIYAZAT]
  print(avgscore); // [40, 13, 10, 3]
}

我个人认为,如果你使用地图列表,特别是如果你计划拥有更多的数据,而不仅仅是列表中的4个数据,对你来说会更容易

下面是一个使用地图的示例

void sortMap() {
  var temp= { 
  "GEORGE":10, 
  "RUSTY":13, 
  "RIYAZAT":3, 
  "JAMES PAWNED":40
  };

  temp = SplayTreeMap.from(
  temp, (key1, key2) => temp[key1].compareTo(temp[key2]));
  print(temp);
}

我个人认为,如果你使用地图列表,特别是如果你计划拥有更多的数据,而不仅仅是列表中的4个数据,对你来说会更容易

下面是一个使用地图的示例

void sortMap() {
  var temp= { 
  "GEORGE":10, 
  "RUSTY":13, 
  "RIYAZAT":3, 
  "JAMES PAWNED":40
  };

  temp = SplayTreeMap.from(
  temp, (key1, key2) => temp[key1].compareTo(temp[key2]));
  print(temp);
}

找不到页面?在它之前,有一个相同的问题和解决方案。我猜它已经被删除了。找不到页面?它就在前面,这是一个相同的问题和解决方案。我想它已经被删除了。如果给定的
compare
方法依赖于外部因素,例如
SplayTreeMap
之外的映射中的元素,则不应该创建一个
SplayTreeMap
。您的问题是,如果以后要向
SplayTreeMap
引入另一个元素,而该元素不是最初创建的
temp
映射的一部分,那么它将无法按预期工作。此外,
SplayTreeMap
是一个基于
键而不是
值的自动排序元素。因此,如果您以后更改给定
键的
,它将不再保持排序。@julemand101谢谢您的帮助,我非常感谢,非常感谢。如果给定的
compare
方法依赖于外部因素,例如
SplayTreeMap
之外的映射中的元素,那么您不应该创建一个
SplayTreeMap
。您的问题是,如果以后要向
SplayTreeMap
引入另一个元素,而该元素不是最初创建的
temp
映射的一部分,那么它将无法按预期工作。此外,
SplayTreeMap
是一个基于
键而不是
值的自动排序元素。因此,如果您以后更改给定
键的
,它将不再保持排序。@julemand101谢谢您的帮助,我真的很感激,非常感谢。但是有一个问题,我还有另一个算法。我对avg分数使用了冒泡排序,对ids数组使用了相同的操作,尽管avgscore总是在下降,但ids数组有时会打印错误的结果。你的算法也一样,你需要一个例子来重现这个问题。我猜您在开始时对
ids
avgscore
的顺序有问题(在我的示例中这两个都是静态设置的,但我猜它们来自您的代码中的某个地方)。不,我意识到这个错误来自firebase,它有时会给出变形数组。但有一个问题,这也是我用另一种算法得到的。我对avg分数使用了冒泡排序,对ids数组使用了相同的操作,尽管avgscore总是在下降,但ids数组有时会打印错误的结果。你的算法也一样,你需要一个例子来重现这个问题。我猜您在开始时对
ids
avgscore
的顺序有问题(在我的示例中这两个都是静态设置的,但我猜它们来自您的代码中的某个地方)。不,我意识到这个错误来自firebase,它有时会给出变形数组。