如何根据3个项目对Dart集合进行排序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据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,但我不知道如何考虑任意点,因为Comparator
的签名只需要2个项目。我想用Comparator
所以我可以打电话给List.sort(Comparator)
。
我是不是只写一个像List<Point> sort(Point point, List<Point> points)
这样的常规函数?
如果有人能想到这个问题的更好的标题,请编辑它。
答案
可比较和比较者是关于将项目相互比较。如果需要相对于对象的外部信息进行比较,则需要将其传递给比较操作。您可以使用以下代码对其进行抽象:
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));
另一答案
import 'dart:math';
import 'package:queries/collections.dart';
void main()
var points =
Collection([Point(0, 0), Point(4, 6), Point(9, 23), Point(55, 3)]);
double distance(Point a, Point b)
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
var myPoint = Point(4, 6);
// <==========
var q = points.orderBy((e) => distance(myPoint, e));
// ==========>
print(q.toList());
class Point
int x, y;
Point(this.x, this.y);
int getManhattanDistanceTo(Point other)
return (x - other.x).abs() + (y - other.y).abs();
String toString()
return '$x:$y';
结果:
[4:6, 0:0, 9:23, 55:3]
以上是关于如何根据3个项目对Dart集合进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 Dart 中的 int 属性对所有 Class 属性进行排序?