Toxic
Toxic

Reputation: 105

Dart: Ordering a list by sequence in another list

I have the following list made up of CustomerName and SalesId example:

List1

In the next part im extracting the unique CustomerName from List1 and putting them in List2, this list will be reordered to the user's liking and may end up looking something like:

List2

Now I want to reorder List1 based on the sequence of list2 (SalesId sequence doesn't matter)

Upvotes: 0

Views: 412

Answers (1)

julemand101
julemand101

Reputation: 31249

You could create a map based on index2 which can be used to lookup the sorting order. So something like this:

void main() {
  final List<Store> list1 = [
    Store(customerName: 'StoreA', salesId: '001'),
    Store(customerName: 'StoreB', salesId: '002'),
    Store(customerName: 'StoreB', salesId: '003'),
    Store(customerName: 'StoreC', salesId: '004'),
  ];

  final List<String> list2 = [
    'StoreB',
    'StoreC',
    'StoreA',
  ];

  final Map<String, int> _sortingOrderMap = {
    for (var i = 0; i < list2.length; i++) list2[i]: i
  };

  print(_sortingOrderMap);
  // {StoreB: 0, StoreC: 1, StoreA: 2}

  list1.forEach(print);
  // StoreA - 001
  // StoreB - 002
  // StoreB - 003
  // StoreC - 004

  list1.sort((s1, s2) => _sortingOrderMap[s1.customerName]!
      .compareTo(_sortingOrderMap[s2.customerName]!));

  list1.forEach(print);
  // StoreB - 002
  // StoreB - 003
  // StoreC - 004
  // StoreA - 001
}

class Store {
  final String customerName;
  final String salesId;

  Store({required this.customerName, required this.salesId});

  @override
  String toString() => '$customerName - $salesId';
}

You might need to modify the solution if you need to handle cases of customerName not being in list2 if that is a possible scenario.

Upvotes: 2

Related Questions