首页 > 解决方案 > 如何根据 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)

如果有人能为这个问题想出一个更好的标题,请编辑它。

标签: dart

解决方案


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));

推荐阅读