Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. /// Выполняет сравнение нарядов по критерию связанности
  2. int compareDetachments (Detachment a, Detachment b) {
  3. final finishAtComparison = a.finishAt.compareTo(b.finishAt);
  4. if(finishAtComparison != 0) return finishAtComparison;
  5. return a.order.id.compareTo(b.order.id);
  6. }
  7.  
  8. typedef bool TestRelated(Detachment detachment);
  9.  
  10. /// Возвращает функцию типа [TestRelated], которая проверяет,
  11. /// является ли наряд связанным с указанным нарядом [oneOfRelated]
  12. TestRelated isRelatedTo(Detachment oneOfRelated) =>
  13. (Detachment detachment) => compareDetachments(oneOfRelated, detachment) == 0;
  14.  
  15. /// Группирует связанные наряды
  16. ///
  17. /// Для правильной группировки наряды должны быть отсортированы так,
  18. /// чтобы связанные наряды шли один за другим:
  19. ///
  20. /// ```
  21. /// [relatedA1, relatedA2,..., relatedAN, relatedB1, relatedB2,...]
  22. List<List<Detachment>> groupRelated(Iterable<Detachment> detachments) {
  23. if(detachments.isEmpty) return [];
  24. TestRelated isRelated = isRelatedTo(detachments.first);
  25. return [detachments.takeWhile(isRelated).toList()]..addAll(groupRelated(detachments.skipWhile(isRelated)));
  26. }
  27.  
  28. void main() {
  29. print (groupRelated(detachments..sort(compareDetachments)));
  30. }
  31.  
  32. // Все, что ниже, нужно только для проверки работоспособности
  33.  
  34. class Detachment {
  35. final DateTime finishAt;
  36. final Order order;
  37.  
  38. Detachment(this.order, this.finishAt);
  39.  
  40. @override
  41. String toString() => '(${order.id} - $finishAt)';
  42. }
  43.  
  44. class Order {
  45. final String id;
  46. Order(this.id);
  47. }
  48.  
  49. final detachments = <Detachment>[
  50. Detachment(Order('1'), DateTime(2019, 06, 12)),
  51. Detachment(Order('2'), DateTime(2019, 06, 13)),
  52. Detachment(Order('1'), DateTime(2019, 06, 12)),
  53. Detachment(Order('2'), DateTime(2019, 06, 13)),
  54. Detachment(Order('1'), DateTime(2019, 06, 12)),
  55. ];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement