如何根据3个项目对Dart集合进行排序?

时间:2019-01-05 19:12:13

标签: 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)之类的常规函数​​吗?

如果有人可以为这个问题想一个更好的标题,请对其进行编辑。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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}]