How to merge overlapping ranges (start,end),(start,end) in VB.NET

1 Answer

0 votes
Imports System
Imports System.Collections.Generic
Imports System.Linq

Module Module1

    Public Structure Range
        Public StartVal As Integer
        Public EndVal As Integer

        Public Sub New(s As Integer, e As Integer)
            StartVal = s
            EndVal = e
        End Sub
    End Structure

    Function MergeRanges(ranges As List(Of Range)) As List(Of Range)
        ' Sort by StartVal
        Dim sorted = ranges.OrderBy(Function(r) r.StartVal).ToList()

        Dim merged As New List(Of Range)()

        For Each r In sorted
            If merged.Count = 0 OrElse r.StartVal > merged.Last().EndVal Then
                merged.Add(New Range(r.StartVal, r.EndVal))
            Else
                Dim last = merged(merged.Count - 1)
                last.EndVal = Math.Max(last.EndVal, r.EndVal)
                merged(merged.Count - 1) = last
            End If
        Next

        Return merged
    End Function

    Sub Main()
        Dim ranges As New List(Of Range) From {
            New Range(302, 447),
            New Range(488, 489),
            New Range(121, 234),
            New Range(200, 421),
            New Range(140, 354)
        }

        Dim result = MergeRanges(ranges)

        For Each r In result
            Console.WriteLine("(" & r.StartVal & ", " & r.EndVal & ")")
        Next
    End Sub

End Module



' run:
'
' (121, 447)
' (488, 489)   
'

 



answered Jan 26 by avibootz
...