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,它有时会给出变形数组。