如何根据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 属性进行排序?

对列表的多个子列表进行排序以创建新列表,Dart

对多个列表的子列表进行排序以创建新的列表,Dart。

如何在 Dart 中对 List<File> 进行排序,最后使用 null 对象

如何在laravel中检索有限数量的相关模型并按相关模型对集合进行排序?