Skip to content

Instantly share code, notes, and snippets.

@bubnenkoff
Created February 1, 2021 08:38
Show Gist options
  • Save bubnenkoff/1a4a77f8b90d08437226cbd53db8e38a to your computer and use it in GitHub Desktop.
Save bubnenkoff/1a4a77f8b90d08437226cbd53db8e38a to your computer and use it in GitHub Desktop.
main() {
genJobs(int activeWorkers, List<int> numbersOfAlreadyActiveJobs) {
final maxJobs = 16;
List<int> jobs = List<int>.generate(maxJobs, (i) => i + 1);
final workerCapacity = (jobs.length / activeWorkers).floor();
jobs.removeWhere((item) => numbersOfAlreadyActiveJobs.contains(item));
if(jobs.length > 0) { // если нужно что-то запускать
for (var workerNumber = 0; workerNumber < activeWorkers; workerNumber++) {
final startIndex = workerNumber * workerCapacity;
final endIndex = startIndex + workerCapacity;
final chunk = jobs.sublist(
startIndex,
endIndex > jobs.length || workerNumber == activeWorkers - 1
? jobs.length
: endIndex,
);
}
}
return null;
}
genJobs(8, [7, 8, 3, 4]);
}
@owczaro
Copy link

owczaro commented Feb 1, 2021

If workerCapacity depends on length of jobs, you should calculate it after removing items from jobs. And remember to check whether the boundary conditions are satisfied or not.

main() {
  print(genJobs(8, [7, 8, 3, 4]));
}

Map<int, List<int>> genJobs(
  int activeWorkers,
  List<int> numbersOfAlreadyActiveJobs,
) {
  var chunks = <int, List<int>>{};
  final maxJobs = 16;
  activeWorkers = activeWorkers < 1 ? 1 : activeWorkers; // there should be at least 1 active worker
  List<int> jobs = List<int>.generate(maxJobs, (i) => i + 1);

  jobs.removeWhere((item) => numbersOfAlreadyActiveJobs.contains(item));
  if (jobs.length == 0) { // if there is no more jobs to run, return an empty map
    return chunks;
  }

  var workerCapacity = (jobs.length / activeWorkers).floor();
  workerCapacity = workerCapacity < 1 ? 1 : workerCapacity; // if there are more active workers than jobs, then each worker can handle one job in order to avoid overwork of workers

  for (var workerNumber = 0; workerNumber < activeWorkers; workerNumber++) {
    final startIndex = workerNumber * workerCapacity;
    final endIndex = startIndex + workerCapacity;
    final chunk = jobs.sublist(
      startIndex,
      endIndex > jobs.length || workerNumber == activeWorkers - 1
          ? jobs.length
          : endIndex,
    );
    chunks.addAll({workerNumber: chunk});
  }

  return chunks;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment