Упорядочить те же пользовательские объекты из ArrayList в дротике - PullRequest
0 голосов
/ 18 марта 2020

У меня есть массив пользовательских объектов, как показано ниже: -

"trackPointList": [
        {
            "latitude": 22.038446,
            "longitude": 88.085593,
            "serialNo": 5,
            "timeZone": "IST"
        },
        {
            "latitude": 22.038446,
            "longitude": 88.085593,
            "serialNo": 6,
            "timeZone": "IST"
        },
        {
            "latitude": 22.496401,
            "longitude": 88.323892,
            "serialNo": 7,
            "timeZone": "IST"
        },
        {
            "latitude": 22.496401,
            "longitude": 88.323892,
            "serialNo": 8,
            "timeZone": "IST"
        },
        {
            "latitude": 22.038446,
            "longitude": 88.085593,
            "serialNo": 9,
            "timeZone": "IST"
        },
        {
            "latitude": 22.038446,
            "longitude": 88.085593,
            "serialNo": 10,
            "timeZone": "IST"
        }
    ],

Я создал класс TrackPoint для пользовательских объектов и список

List<TrackPoint> trackingPoints;

Я успешно заполнил объекты в приведенном выше списке. Теперь я хочу собрать те же объекты, у которых значения lat и long совпадают с другими объектами, в отдельные списки. Например, в приведенном выше случае я хочу два списка, которые содержат 4 одинаковых объекта в одном списке и два других одинаковых объекта в отдельном списке по широте и долготе.

Кроме того, если есть другие различные объекты по их lat и long, тогда их следует хранить в другом списке.

Пожалуйста, дайте мне знать, как этого добиться.

1 Ответ

1 голос
/ 18 марта 2020

Я не знаю, как называются операции такого типа, поэтому в итоге я вызвал свою реализацию для collectByCompare.

Следующая реализация представляет собой расширение для класса List, которое позволяет группировать записи в Списке, равные по методу test, которые вы можете указать в качестве входных данных для метода:

class TrackPoint {
  final double latitude;
  final double longitude;
  final int serialNo;
  final String timeZone;

  const TrackPoint(this.latitude, this.longitude, this.serialNo, this.timeZone);

  @override
  String toString() =>
      '<latitude=$latitude longitude=$longitude serialNo=$serialNo>';
}

void main() {
  const trackingPoints = [
    TrackPoint(22.038446, 88.085593, 5, "IST"),
    TrackPoint(22.038446, 88.085593, 6, "IST"),
    TrackPoint(22.496401, 88.323892, 7, "IST"),
    TrackPoint(22.496401, 88.323892, 8, "IST"),
    TrackPoint(22.038446, 88.085593, 9, "IST"),
    TrackPoint(22.038446, 88.085593, 10, "IST")
  ];

  trackingPoints
      .collectByCompare((TrackPoint a, TrackPoint b) =>
          (a.latitude == b.latitude) && (a.longitude == b.longitude))
      .forEach(print);

  /* Output:
    [<latitude=22.038446 longitude=88.085593 serialNo=5>, <latitude=22.038446 longitude=88.085593 serialNo=6>, <latitude=22.038446 longitude=88.085593 serialNo=9>, <latitude=22.038446 longitude=88.085593 serialNo=10>]
    [<latitude=22.496401 longitude=88.323892 serialNo=7>, <latitude=22.496401 longitude=88.323892 serialNo=8>]
   */
}

extension<E> on List<E> {
  Iterable<List<E>> collectByCompare(bool Function(E, E) test) sync* {
    final handled = <E>[];

    for (final a in this.where((e) => !handled.contains(e))) {
      final result = this.where((b) => test(a, b)).toList();
      yield result;
      handled.addAll(result);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...