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

List1

  • StoreA - 001
  • StoreB - 002
  • StoreB - 003
  • StoreC - 004

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

  • StoreB
  • StoreC
  • StoreA

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

  • StoreB - 002
  • StoreB - 003
  • StoreC - 004
  • StoreA - 001


Solution 1: julemand101

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.