dart - 如何根据 3 个项目对 Dart 集合进行排序?
问题描述
考虑一个List<Point>
:
class Point {
int x,y;
int getManhattanDistanceTo(Point other) {
return (x - other.x).abs() + (y - other.y).abs();
}
Point(this.x,this.y);
}
void main() {
var points = [Point(0,0), Point(4,6), Point(9,23), Point(55,3)];
// How to sort points based on distance from an arbitrary Point?
}
我想根据它们与任意Point
. 我不认为实施Comparable是一个好主意。相反,我可以写一个Comparator,但我不确定如何考虑任意点,因为 aComparator
的签名只需要 2 个项目。我想使用 aComparator
这样我就可以打电话了List.sort(Comparator)
。
我是否坚持只写一个常规功能,例如List<Point> sort(Point point, List<Point> points)
?
如果有人能为这个问题想出一个更好的标题,请编辑它。
解决方案
Comparable 和 Comparator 用于将项目相互比较。如果您需要将外部信息与对象进行比较,则需要将其传递给比较操作。您可以使用以下代码对其进行抽象:
Function sortRelativeTo(Point reference) {
int comp(Point p1, Point p2) {
return p1
.getManhattanDistanceTo(reference)
.compareTo(p2.getManhattanDistanceTo(reference));
}
return comp;
}
然后您可以将其用作:
Point reference = Point(xxx, yyy);
points.sort(sortRelativeTo(reference));
推荐阅读
- python - TensorFlow 在一个 GPU 上同时训练多个较小的批次
- ios - AVCapturePhotoOutput didFinishProcessingPhoto 没有被调用
- android - 更改 TextField 中光标的大小(Jetpack Compose)
- azure - 如何在通过 ARM 创建 Key Vault 时分配“Key Vault Secrets User”RBAC 角色
- python - Flask 博客文章正在删除最后一篇博客文章,而不是想要的
- c# - 如何在 C# TCP 中的客户端-服务器之间同时读写两种方式
- flutter - TextFormField 不再关注重绘
- github - gitlab管道在代码推送和合并请求时自动添加
- validation - API 测试:验证动态 Rest Response 的方法(底层数据库中的 JSON 属性/值经常变化)
- java - 如何在android的firebase firestore中删除文档内的列表项?