Как функционально объединить перекрывающиеся диапазоны номеров из списка

У меня есть несколько объектов диапазона, которые мне нужно объединить, чтобы все перекрывающиеся диапазоны исчезают:

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  

Императивный алгоритм:

  1. Извлечь () первый объект-диапазон и перебрать остальную часть списка, сравнивая его с каждым из другие диапазоны.
  2. если есть перекрывающийся элемент, объедините их вместе (это даст новый экземпляр Range) и удалите 2 кандидата на слияние из исходного списка.
  3. В конце списка добавьте объект Range (который мог изменяться много раз в результате слияния) в список final-result.
  4. Повторите это со следующим из оставшихся элементов.
  5. Когда список источников пуст, мы закончили.

Чтобы сделать это в обязательном порядке, нужно создать множество временных переменных, индексированных циклов и т. Д.

Так что мне интересно, есть ли более функциональный подход?

На первый взгляд, исходная коллекция должна иметь возможность действовать как стек, предоставляя pop () PLUS давая возможность удалять элементы по индексу во время итерации по нему, но тогда это уже не будет так функционально.

9
задан recalcitrant 9 February 2012 в 21:15
поделиться