huMpty duMpty
huMpty duMpty

Reputation: 14460

Compare two arrays with different dimension

I am trying to compare two arrays that always have different dimensions.

eg. arr1 -> {1,2,3} and arr2->{1,2}

I did try and able to get the matching items to new array. But I am expecting to get the unmatched items only

I am expecting to compare both arrays and put only the item '3' to a new array which is in arr1 and not in arr2

eg arr1 -> {1,2,3} and arr2->{1,2} should result a new array with 3 arr1 -> {1,2,3,4} and arr2->{1,2} should result a array with 3,4

Is there any way of doing this for older version of .net framework without using Enumerable.Except

Upvotes: 0

Views: 832

Answers (3)

Andrew Morton
Andrew Morton

Reputation: 25023

For two sorted arrays of integers with no duplicates, as shown in your examples,

Public Function differences(a() As Integer, b() As Integer) As Integer()

    Dim aLen As Integer = a.Length
    If aLen = 0 Then
        Return b
    End If

    Dim bLen As Integer = b.Length
    If bLen = 0 Then
        Return a
    End If

    Dim diff As New List(Of Integer)

    Dim i As Integer = 0
    Dim j As Integer = 0

    Do
        If a(i) = b(j) Then
            i += 1
            j += 1
        ElseIf a(i) > b(j) Then
            diff.Add(b(j))
            j += 1
        ElseIf a(i) < b(j) Then
            diff.Add(a(i))
            i += 1
        End If
    Loop While i < aLen AndAlso j < bLen

    If i < aLen Then
        For k = i To aLen - 1
            diff.Add(a(k))
        Next
    End If

    If j < bLen Then
        For k = j To bLen - 1
            diff.Add(b(k))
        Next
    End If

    Return diff.ToArray

End Function

Upvotes: 0

huMpty duMpty
huMpty duMpty

Reputation: 14460

I have done something like this. if we have two arrays called paramOld{"1","2","3"} and paramNew{"2","3"}

If paramOld.Length > paramNew.Length Then
            Dim paramDelete((paramOld.Length - paramNew.Length) - 1) As String


            Dim isFound As Boolean = False
            For i As Int32 = 0 To oldparamLenght - 1
                isFound = False
                For j As Int32 = 0 To newparamLength - 1
                    If paramOld(i) = paramNew(j) Then
                        isFound = True
                        Exit For
                    End If
                Next
                If isFound = False Then
                    paramDelete(i) = paramOld(i)
                End If
            Next
End If

Upvotes: 1

Adriano Repetti
Adriano Repetti

Reputation: 67090

Can you use LINQ? Except() may be right for you.

var arr3 = arr1.Except(arr2);

Edited

If you can't use LINQ here a quick and dirty version of that function:

Public Shared Function Except(a As List(Of Integer), b As List(Of Integer)) As List(Of Integer)
    Dim result As New List(Of Integer)()

    For Each value As Integer In a
        If Not b.Contains(value) Then
            result.Add(value)
        End If
    Next

    For Each value As Integer In b
        If Not a.Contains(value) Then
            result.Add(value)
        End If
    Next

    Return result
End Function

Upvotes: 0

Related Questions