Группировать список элементов в другую структуру данных?

#list #algorithm #dart #grouping

#Список #алгоритм #dart #группировка

Вопрос:

У меня есть эти классы:

 class Car {
  String carId;
  int yearOfManufacture;
  //constructor, fromJson, toJson ...
}

class CarsByYears {
  int yearOfManufacture;
  List<Car> carList;
  //constructor, fromJson, toJson ...
}
  

И мне нужно сгенерировать подобную структуру данных только на основе данного списка автомобилей:

 List<CarsByYears>
  

Итак, я получаю List<Car> список, и мне нужно создать List<CarsByYears> из него список. Итак, мне нужно сгруппировать автомобили по годам.
Например, у меня есть List<Car> список, который содержит эти:

 Car(1, 1990)
Car(2, 2001)
Car(3, 1990)
  

Мне нужно создать List<CarsByYears> , который содержит 2 CarsByYears объекта:

Первый из них выглядит так: yearOfManufacture = 1990 и carList содержит 1-й и 3-й объект car, а другой CarsByYears содержит 2-й объект Car в своем списке, и yearOfManufacture = 2001

Как я могу это сделать?

Комментарии:

1. Совет: создайте карту <int, CarsByYears>, индексируемую по годам, или, что лучше, используйте карту<int, List<Car>> .

Ответ №1:

Вы можете использовать groupBy функцию, предоставляемую пакетом collection (которая создает карту из списка, просматривая его, используя общее значение в качестве ключа), а затем сопоставлять Map записи.

 class Car {
  final String carId;
  final int yearOfManufacture;

  Car(this.carId, this.yearOfManufacture);

  @override
  String toString() => 'Car($carId)';

  // Use your constructor and methods
}

class CarsByYears {
  final int yearOfManufacture;
  final List<Car> carList;

  CarsByYears(this.yearOfManufacture, this.carList);

  @override
  String toString() => 'Year: $yearOfManufacture, Cars: $carList';

  // Use your constructor and methods
}

void main() {
  var cars = [
    Car('1', 2000),
    Car('2', 2002),
    Car('3', 2000),
    Car('4', 2002),
    Car('1', 2005)
  ];
  var carsByYear = groupBy<Car, int>(cars, (e) => e.yearOfManufacture)
      .entries
      .map((e) => CarsByYears(e.key, e.value))
      .toList();
  print(carsByYear); //Output: [Year: 2000, Cars: [Car(1), Car(3)], Year: 2002, Cars: [Car(2), Car(4)], Year: 2005, Cars: [Car(1)]]

}