为Dart编写sortBy函数

时间:2019-10-16 12:17:25

标签: sorting dart comparable

我正在尝试编写一个实用程序函数,用于按给定属性对列表进行排序:

List<T> sortBy<T, U extends Comparable<U>>(List<T> items, U Function(T item) f) =>
    items.toList()..sort((item1, item2) => f(item1).compareTo(f(item2)));

例如,当属性为int时,我遇到了一个问题。

sortBy<String, int>(['apple', 'ball', 'cow'], (word) => word.length);

我收到编译错误:

error: 'int' doesn't extend 'Comparable<int>'.

为什么int不是Comparable?有没有另一种写sortBy的方法,使其既可以在int上也可以在Comparable上工作?

2 个答案:

答案 0 :(得分:2)

int确实实现了Comparable,但是实现了Comparable<num>,这是您的问题,因为您要检查Comparable<int>。您不可以像这样定义sortBy吗?

List<T> sortBy<T, U extends Comparable>(List<T> items, U Function(T item) f) =>
    items.toList()..sort((item1, item2) => f(item1).compareTo(f(item2)));

这似乎可行,因为我们现在只想确保U扩展Comparable

答案 1 :(得分:2)

Soon Dart将支持静态扩展方法。
借助此功能,您可以使用一些现成的扩展程序。

示例:

import 'package:enumerable/enumerable.dart';

void main(List<String> args) {
  final sorded = ['apple', 'ball', 'cow'].orderBy((e) => e.length);
  print(sorded);
}

结果:

(cow, ball, apple)