我想对列表进行两次排序。
示例列表(这里是一个带有模型的示例列表):
[Model("A", 5), Model("C", 3), Model("B", 7) Model("F", 5), Model("D", 5)]
我想要的是先按字母顺序排序,然后再按数字排序。如果我这样做,我得到以下结果:
[Model("C", 3), Model("A", 5), Model("D", 5) Model("F", 5), Model("B", 7)]
:
按字母顺序排序:
[Model("A", 5), Model("B", 7), Model("C", 3) Model("D", 5), Model("F", 5)]
数值:
[Model("C", 3), Model("A", 5), Model("F", 5) Model("D", 5), Model("B", 7)]
我代码:Stream<List<T>> function<T>({
…
int Function(T lhs, T rhs) sort,
}) {
…
List<T> result = …;
result.sort(sort);
}
Stream<List<Model>> stream() {
return function(
…
sort: (a, b) => a.alphabet.toLowerCase().compareTo(b.alphabetc.toLowerCase())
);
}
如果你需要更多的信息,请随时留下评论。
如何对列表进行两次排序?我将感激任何帮助。提前感谢!
尝试以下代码,首先,在您的Model
类上实现Comparable
类,并像这样实现compareTo
方法:
class Model implements Comparable {
final String char;
final int number;
Model(this.char, this.number);
@override
toString() {
return "Model('$char', '$number')";
}
@override
int compareTo(other) {
if (other is Model) {
if (number == other.number) {
return other.char.compareTo(char);
} else {
return other.number.compareTo(number);
}
} else {
return 0;
}
}
}
然后,以这个例子
List<Model> a = [
Model("A", 5),
Model("C", 3),
Model("B", 7),
Model("F", 5),
Model("D", 5),
];
试着排序它会让你得到你想要的结果:
a.sort((a, b) => b.compareTo(a) );
print(a); // [Model('C', '3'), Model('A', '5'), Model('D', '5'), Model('F', '5'), Model('B', '7')]
你可以像这样连续调用它两次:
modelList.sort(
(a, b) => a.alphabet.compareTo(b.alphabet),
);
modelList.sort(
(a, b) => a.number.compareTo(b.number),
);
在你的例子中:
Stream<List<T>> function<T>({
…
int Function(T lhs, T rhs) sort1,
int Function(T lhs, T rhs) sort2,
}) {
…
List<T> result = …;
result.sort(sort1);
result.sort(sort2);
}
结果:
for (var element in modelList) {
print("element = ${element.alphabet}"); //C, A, D, F, B
}