У меня есть несколько объектов диапазона, которые мне нужно объединить, чтобы исчезли все перекрывающиеся диапазоны:
case class Range(from:Int, to:Int)
val rangelist = List(Range(3, 40), Range(1, 45), Range(2, 50), etc)
Вот диапазоны:
3 40
1 45
2 50
70 75
75 90
80 85
100 200
После завершения мы получим:
1 50
70 90
100 200
Императивный алгоритм:
- Pop () первый диапазон-obj и итерации по остальной части списка, сравнивая его с каждым из других диапазонов.
- если есть перекрывающийся элемент,
объединить их вместе (это дает новый экземпляр Range) и удалить 2 кандидатов на слияние из списка источников.
- В конце списка добавить объект Range (который мог много раз измениться при слиянии) в список окончательных результатов.
- Повторите это со следующим из оставшихся предметов.
- Как только список источников пуст, мы закончили.
Для этого необходимо создать много временных переменных, проиндексированных циклов и т. Д.
Так мне интересно, есть ли более функциональный подход?
На первый взгляд, исходная коллекция должна быть в состоянии действовать как стек в обеспечении pop () PLUS.
предоставляя возможность удалять элементы по индексу во время итерации по нему, но тогда это больше не будет работать.