Binary Search Tree - CompareTo Error

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • BenCoo

    Binary Search Tree - CompareTo Error

    Hello,

    In a Binary Search Tree I get the error : Object must be of type String

    if I run the form only with the "Dim bstLidnummer As New BinarySearchTre e"
    it works fine.

    Thanks for any help on this,

    Benny

    My BST-code lookes lokes this :
    *************** *************** *************** *****
    Class BST
    *************** *************** *************** *****
    Public Class BinarySearchTre e
    Private Class TreeNode
    Private mData As IComparable
    Private mLeftNode As TreeNode
    Private mRightNode As TreeNode

    Public Sub New(ByVal data As IComparable)
    Me.mData = data
    End Sub

    Public ReadOnly Property Data() As IComparable
    Get
    Return Me.mData
    End Get
    End Property

    Public Property LeftNode() As TreeNode
    Get
    Return Me.mLeftNode
    End Get
    Set(ByVal value As TreeNode)
    Me.mLeftNode = value
    End Set
    End Property

    Public Property RightNode() As TreeNode
    Get
    Return Me.mRightNode
    End Get
    Set(ByVal value As TreeNode)
    Me.mRightNode = value
    End Set
    End Property

    Public Sub Add(ByVal data As IComparable)
    If data.CompareTo( Me.mData) <= 0 Then
    If Me.mLeftNode Is Nothing Then
    Me.mLeftNode = New TreeNode(data)
    Else
    Me.mLeftNode.Ad d(data)
    End If
    Else
    If Me.mRightNode Is Nothing Then
    Me.mRightNode = New TreeNode(data)
    Else
    Me.mRightNode.A dd(data)
    End If
    End If
    End Sub
    End Class

    Private mRoot As TreeNode

    Public Sub Add(ByVal data As IComparable)
    If mRoot Is Nothing Then
    mRoot = New TreeNode(data)
    Else
    mRoot.Add(data)
    End If
    End Sub

    Public Function Search(ByVal data As IComparable) As Object
    Return Me.Search(data, Me.mRoot)
    End Function

    Private Function Search(ByVal data As IComparable, ByVal node As
    TreeNode) As Object

    If node Is Nothing Then
    Return Nothing
    Else
    Dim result As Integer = data.CompareTo( node.Data) '****** this is
    the error I get on this line :Object must be of type String.

    If result = 0 Then
    Return node.Data
    ElseIf result < 0 Then
    Return Me.Search(data, node.LeftNode)
    Else
    Return Me.Search(data, node.RightNode)
    End If
    End If

    End Function
    End Class
    *************** **************
    The class Person
    *************** **************
    Public Class Persoon
    Inherits BusinessObject
    Implements IComparable

    Private mVnaam As String
    Private mAnaam As String

    Public Sub New(ByVal Vnaam As String, ByVal Anaam As String)
    Me.mVnaam = Vnaam
    Me.mAnaam = Anaam
    End Sub

    Public Property Vnaam() As String
    Get
    Return Me.mVnaam
    End Get
    Set(ByVal value As String)
    mVnaam = value
    End Set
    End Property

    Public Property Anaam() As String
    Get
    Return Me.mAnaam
    End Get
    Set(ByVal value As String)
    Me.mAnaam = value
    End Set
    End Property

    Public Overrides Function IsValid() As Boolean
    If Me.isValidVnaam () And Me.isValidAnaam () Then
    Return True
    Else
    Return False
    End If
    End Function

    Private Function isValidVnaam() As Boolean
    If Me.Vnaam.Trim.L ength 0 Then
    Return True
    Else
    Return False
    End If
    End Function

    Private Function isValidAnaam() As Boolean
    If Me.Anaam.Trim.L ength 0 Then
    Return True
    Else
    Return False
    End If
    End Function

    Public Overloads Function CompareTo(ByVal obj As Object) As Integer
    Implements System.ICompara ble.CompareTo
    Return Me.mVnaam.Compa reTo(CType(obj, Persoon).Vnaam)
    End Function
    End Class
    *************** *************** ****
    The Form :
    *************** *************** ****
    Public Class frmBinarySearch Tree

    Private Sub btnExecute_Clic k(ByVal sender As System.Object, ByVal e As
    System.EventArg s) Handles btnExecute.Clic k
    Dim bstLedenLijst As New BinarySearchTre e
    Dim bstLidnummer As New BinarySearchTre e
    Dim txtOutput As String = ""

    bstLidnummer.Ad d("5")
    bstLidnummer.Ad d("2")
    bstLidnummer.Ad d("1")
    bstLidnummer.Ad d("4")
    bstLidnummer.Ad d("3")
    txtOutput = bstLidnummer.Se arch("3") & vbCrLf

    bstLedenLijst.A dd(New Persoon("Nicole ", "Kidman"))
    bstLedenLijst.A dd(New Persoon("Jamie-Lee", "Curtis"))
    bstLedenLijst.A dd(New Persoon("Demi", "Moore"))
    bstLedenLijst.A dd(New Persoon("Julia" , "Roberts"))
    bstLedenLijst.A dd(New Persoon("Andie" , "MacDowell" ))

    txtOutput &= bstLedenLijst.S earch("Demi") ' & vbCrLf

    Me.txtOutput.Te xt = txtOutput

    End Sub

    Private Sub btnExit_Click(B yVal sender As System.Object, ByVal e As
    System.EventArg s) Handles btnExit.Click
    Application.Exi t()
    End Sub

    End Class



  • Jay B. Harlow

    #2
    Re: Binary Search Tree - CompareTo Error

    BenCoo,
    Interesting homework assignment; I miss those days...

    Anyway to answer your question:
    Dim bstLedenLijst As New BinarySearchTre e
    Dim bstLidnummer As New BinarySearchTre e
    Dim txtOutput As String = ""
    >
    bstLidnummer.Ad d("5")
    txtOutput = bstLidnummer.Se arch("3") & vbCrLf
    >
    bstLedenLijst.A dd(New Persoon("Nicole ", "Kidman"))
    >
    txtOutput &= bstLedenLijst.S earch("Demi") ' & vbCrLf
    Ah! There's the Rub!

    bstLedenLijst contains a collection of Persoon objects, you are attempting
    to compare Persoon objects to a String object! You need to pass a Persoon
    object to bstLedenLijst.S earch. I would recommend you change
    BinarySearchTre e to a Generic class; changing this obscure runtime error
    into an obvious compile time error!

    Something like:

    Public Class BinarySearchTre e(Of T As IComparable)

    Private Class TreeNode
    Private mData As T
    Private mLeftNode As TreeNode
    Private mRightNode As TreeNode

    Public Sub New(ByVal data As T)
    Me.mData = data
    End Sub

    Public ReadOnly Property Data() As T
    Get
    Return Me.mData
    End Get
    End Property

    Public Property LeftNode() As TreeNode
    Get
    Return Me.mLeftNode
    End Get
    Set(ByVal value As TreeNode)
    Me.mLeftNode = value
    End Set
    End Property

    Public Property RightNode() As TreeNode
    Get
    Return Me.mRightNode
    End Get
    Set(ByVal value As TreeNode)
    Me.mRightNode = value
    End Set
    End Property

    Public Sub Add(ByVal data As T)
    If data.CompareTo( Me.mData) <= 0 Then
    If Me.mLeftNode Is Nothing Then
    Me.mLeftNode = New TreeNode(data)
    Else
    Me.mLeftNode.Ad d(data)
    End If
    Else
    If Me.mRightNode Is Nothing Then
    Me.mRightNode = New TreeNode(data)
    Else
    Me.mRightNode.A dd(data)
    End If
    End If
    End Sub
    End Class

    Private mRoot As TreeNode

    Public Sub Add(ByVal data As T)
    If mRoot Is Nothing Then
    mRoot = New TreeNode(data)
    Else
    mRoot.Add(data)
    End If
    End Sub

    Public Function Search(ByVal data As T) As Object
    Return Me.Search(data, Me.mRoot)
    End Function

    Private Function Search(ByVal data As T, ByVal node As TreeNode) As
    Object

    If node Is Nothing Then
    Return Nothing
    Else
    Dim result As Integer = data.CompareTo( node.Data) '****** this
    is the error I get on this line :Object must be of type String.

    If result = 0 Then
    Return node.Data
    ElseIf result < 0 Then
    Return Me.Search(data, node.LeftNode)
    Else
    Return Me.Search(data, node.RightNode)
    End If
    End If

    End Function
    End Class

    Then when you define your trees, you give the type of tree they are!
    Dim bstLedenLijst As New BinarySearchTre e(Of String)
    Dim bstLidnummer As New BinarySearchTre e(Of Persoon)
    NOTE: You need VS 2005 for generics.

    --
    Hope this helps
    Jay B. Harlow
    ..NET Application Architect, Enthusiast, & Evangelist
    T.S. Bradley - http://www.tsbradley.net


    "BenCoo" <teddyb58@hotma il.comwrote in message
    news:CNPkh.2608 24$tk1.5394486@ phobos.telenet-ops.be...
    Hello,
    >
    In a Binary Search Tree I get the error : Object must be of type String
    >
    if I run the form only with the "Dim bstLidnummer As New
    BinarySearchTre e"
    it works fine.
    >
    Thanks for any help on this,
    >
    Benny
    >
    My BST-code lookes lokes this :
    *************** *************** *************** *****
    Class BST
    *************** *************** *************** *****
    Public Class BinarySearchTre e
    Private Class TreeNode
    Private mData As IComparable
    Private mLeftNode As TreeNode
    Private mRightNode As TreeNode
    >
    Public Sub New(ByVal data As IComparable)
    Me.mData = data
    End Sub
    >
    Public ReadOnly Property Data() As IComparable
    Get
    Return Me.mData
    End Get
    End Property
    >
    Public Property LeftNode() As TreeNode
    Get
    Return Me.mLeftNode
    End Get
    Set(ByVal value As TreeNode)
    Me.mLeftNode = value
    End Set
    End Property
    >
    Public Property RightNode() As TreeNode
    Get
    Return Me.mRightNode
    End Get
    Set(ByVal value As TreeNode)
    Me.mRightNode = value
    End Set
    End Property
    >
    Public Sub Add(ByVal data As IComparable)
    If data.CompareTo( Me.mData) <= 0 Then
    If Me.mLeftNode Is Nothing Then
    Me.mLeftNode = New TreeNode(data)
    Else
    Me.mLeftNode.Ad d(data)
    End If
    Else
    If Me.mRightNode Is Nothing Then
    Me.mRightNode = New TreeNode(data)
    Else
    Me.mRightNode.A dd(data)
    End If
    End If
    End Sub
    End Class
    >
    Private mRoot As TreeNode
    >
    Public Sub Add(ByVal data As IComparable)
    If mRoot Is Nothing Then
    mRoot = New TreeNode(data)
    Else
    mRoot.Add(data)
    End If
    End Sub
    >
    Public Function Search(ByVal data As IComparable) As Object
    Return Me.Search(data, Me.mRoot)
    End Function
    >
    Private Function Search(ByVal data As IComparable, ByVal node As
    TreeNode) As Object
    >
    If node Is Nothing Then
    Return Nothing
    Else
    Dim result As Integer = data.CompareTo( node.Data) '****** this is
    the error I get on this line :Object must be of type String.
    >
    If result = 0 Then
    Return node.Data
    ElseIf result < 0 Then
    Return Me.Search(data, node.LeftNode)
    Else
    Return Me.Search(data, node.RightNode)
    End If
    End If
    >
    End Function
    End Class
    *************** **************
    The class Person
    *************** **************
    Public Class Persoon
    Inherits BusinessObject
    Implements IComparable
    >
    Private mVnaam As String
    Private mAnaam As String
    >
    Public Sub New(ByVal Vnaam As String, ByVal Anaam As String)
    Me.mVnaam = Vnaam
    Me.mAnaam = Anaam
    End Sub
    >
    Public Property Vnaam() As String
    Get
    Return Me.mVnaam
    End Get
    Set(ByVal value As String)
    mVnaam = value
    End Set
    End Property
    >
    Public Property Anaam() As String
    Get
    Return Me.mAnaam
    End Get
    Set(ByVal value As String)
    Me.mAnaam = value
    End Set
    End Property
    >
    Public Overrides Function IsValid() As Boolean
    If Me.isValidVnaam () And Me.isValidAnaam () Then
    Return True
    Else
    Return False
    End If
    End Function
    >
    Private Function isValidVnaam() As Boolean
    If Me.Vnaam.Trim.L ength 0 Then
    Return True
    Else
    Return False
    End If
    End Function
    >
    Private Function isValidAnaam() As Boolean
    If Me.Anaam.Trim.L ength 0 Then
    Return True
    Else
    Return False
    End If
    End Function
    >
    Public Overloads Function CompareTo(ByVal obj As Object) As Integer
    Implements System.ICompara ble.CompareTo
    Return Me.mVnaam.Compa reTo(CType(obj, Persoon).Vnaam)
    End Function
    End Class
    *************** *************** ****
    The Form :
    *************** *************** ****
    Public Class frmBinarySearch Tree
    >
    Private Sub btnExecute_Clic k(ByVal sender As System.Object, ByVal e As
    System.EventArg s) Handles btnExecute.Clic k
    Dim bstLedenLijst As New BinarySearchTre e
    Dim bstLidnummer As New BinarySearchTre e
    Dim txtOutput As String = ""
    >
    bstLidnummer.Ad d("5")
    bstLidnummer.Ad d("2")
    bstLidnummer.Ad d("1")
    bstLidnummer.Ad d("4")
    bstLidnummer.Ad d("3")
    txtOutput = bstLidnummer.Se arch("3") & vbCrLf
    >
    bstLedenLijst.A dd(New Persoon("Nicole ", "Kidman"))
    bstLedenLijst.A dd(New Persoon("Jamie-Lee", "Curtis"))
    bstLedenLijst.A dd(New Persoon("Demi", "Moore"))
    bstLedenLijst.A dd(New Persoon("Julia" , "Roberts"))
    bstLedenLijst.A dd(New Persoon("Andie" , "MacDowell" ))
    >
    txtOutput &= bstLedenLijst.S earch("Demi") ' & vbCrLf
    >
    Me.txtOutput.Te xt = txtOutput
    >
    End Sub
    >
    Private Sub btnExit_Click(B yVal sender As System.Object, ByVal e As
    System.EventArg s) Handles btnExit.Click
    Application.Exi t()
    End Sub
    >
    End Class
    >
    >
    >

    Comment

    • Jay B. Harlow

      #3
      Re: Binary Search Tree - CompareTo Error

      Doh!

      Clicked send too soon. I had the trees backwards:

      Dim bstLedenLijst As New BinarySearchTre e(Of Persoon)
      Dim bstLidnummer As New BinarySearchTre e(Of String)

      Of course this demonstrated the immediate & obvious compile time error I
      suggested ;-)

      --
      Hope this helps
      Jay B. Harlow
      ..NET Application Architect, Enthusiast, & Evangelist
      T.S. Bradley - http://www.tsbradley.net


      "BenCoo" <teddyb58@hotma il.comwrote in message
      news:CNPkh.2608 24$tk1.5394486@ phobos.telenet-ops.be...
      Hello,
      >
      In a Binary Search Tree I get the error : Object must be of type String
      >
      if I run the form only with the "Dim bstLidnummer As New
      BinarySearchTre e"
      it works fine.
      >
      Thanks for any help on this,
      >
      Benny
      >
      My BST-code lookes lokes this :
      *************** *************** *************** *****
      Class BST
      *************** *************** *************** *****
      Public Class BinarySearchTre e
      Private Class TreeNode
      Private mData As IComparable
      Private mLeftNode As TreeNode
      Private mRightNode As TreeNode
      >
      Public Sub New(ByVal data As IComparable)
      Me.mData = data
      End Sub
      >
      Public ReadOnly Property Data() As IComparable
      Get
      Return Me.mData
      End Get
      End Property
      >
      Public Property LeftNode() As TreeNode
      Get
      Return Me.mLeftNode
      End Get
      Set(ByVal value As TreeNode)
      Me.mLeftNode = value
      End Set
      End Property
      >
      Public Property RightNode() As TreeNode
      Get
      Return Me.mRightNode
      End Get
      Set(ByVal value As TreeNode)
      Me.mRightNode = value
      End Set
      End Property
      >
      Public Sub Add(ByVal data As IComparable)
      If data.CompareTo( Me.mData) <= 0 Then
      If Me.mLeftNode Is Nothing Then
      Me.mLeftNode = New TreeNode(data)
      Else
      Me.mLeftNode.Ad d(data)
      End If
      Else
      If Me.mRightNode Is Nothing Then
      Me.mRightNode = New TreeNode(data)
      Else
      Me.mRightNode.A dd(data)
      End If
      End If
      End Sub
      End Class
      >
      Private mRoot As TreeNode
      >
      Public Sub Add(ByVal data As IComparable)
      If mRoot Is Nothing Then
      mRoot = New TreeNode(data)
      Else
      mRoot.Add(data)
      End If
      End Sub
      >
      Public Function Search(ByVal data As IComparable) As Object
      Return Me.Search(data, Me.mRoot)
      End Function
      >
      Private Function Search(ByVal data As IComparable, ByVal node As
      TreeNode) As Object
      >
      If node Is Nothing Then
      Return Nothing
      Else
      Dim result As Integer = data.CompareTo( node.Data) '****** this is
      the error I get on this line :Object must be of type String.
      >
      If result = 0 Then
      Return node.Data
      ElseIf result < 0 Then
      Return Me.Search(data, node.LeftNode)
      Else
      Return Me.Search(data, node.RightNode)
      End If
      End If
      >
      End Function
      End Class
      *************** **************
      The class Person
      *************** **************
      Public Class Persoon
      Inherits BusinessObject
      Implements IComparable
      >
      Private mVnaam As String
      Private mAnaam As String
      >
      Public Sub New(ByVal Vnaam As String, ByVal Anaam As String)
      Me.mVnaam = Vnaam
      Me.mAnaam = Anaam
      End Sub
      >
      Public Property Vnaam() As String
      Get
      Return Me.mVnaam
      End Get
      Set(ByVal value As String)
      mVnaam = value
      End Set
      End Property
      >
      Public Property Anaam() As String
      Get
      Return Me.mAnaam
      End Get
      Set(ByVal value As String)
      Me.mAnaam = value
      End Set
      End Property
      >
      Public Overrides Function IsValid() As Boolean
      If Me.isValidVnaam () And Me.isValidAnaam () Then
      Return True
      Else
      Return False
      End If
      End Function
      >
      Private Function isValidVnaam() As Boolean
      If Me.Vnaam.Trim.L ength 0 Then
      Return True
      Else
      Return False
      End If
      End Function
      >
      Private Function isValidAnaam() As Boolean
      If Me.Anaam.Trim.L ength 0 Then
      Return True
      Else
      Return False
      End If
      End Function
      >
      Public Overloads Function CompareTo(ByVal obj As Object) As Integer
      Implements System.ICompara ble.CompareTo
      Return Me.mVnaam.Compa reTo(CType(obj, Persoon).Vnaam)
      End Function
      End Class
      *************** *************** ****
      The Form :
      *************** *************** ****
      Public Class frmBinarySearch Tree
      >
      Private Sub btnExecute_Clic k(ByVal sender As System.Object, ByVal e As
      System.EventArg s) Handles btnExecute.Clic k
      Dim bstLedenLijst As New BinarySearchTre e
      Dim bstLidnummer As New BinarySearchTre e
      Dim txtOutput As String = ""
      >
      bstLidnummer.Ad d("5")
      bstLidnummer.Ad d("2")
      bstLidnummer.Ad d("1")
      bstLidnummer.Ad d("4")
      bstLidnummer.Ad d("3")
      txtOutput = bstLidnummer.Se arch("3") & vbCrLf
      >
      bstLedenLijst.A dd(New Persoon("Nicole ", "Kidman"))
      bstLedenLijst.A dd(New Persoon("Jamie-Lee", "Curtis"))
      bstLedenLijst.A dd(New Persoon("Demi", "Moore"))
      bstLedenLijst.A dd(New Persoon("Julia" , "Roberts"))
      bstLedenLijst.A dd(New Persoon("Andie" , "MacDowell" ))
      >
      txtOutput &= bstLedenLijst.S earch("Demi") ' & vbCrLf
      >
      Me.txtOutput.Te xt = txtOutput
      >
      End Sub
      >
      Private Sub btnExit_Click(B yVal sender As System.Object, ByVal e As
      System.EventArg s) Handles btnExit.Click
      Application.Exi t()
      End Sub
      >
      End Class
      >
      >
      >

      Comment

      • Jay B. Harlow

        #4
        Re: Binary Search Tree - CompareTo Error

        Reviewing this, one more change:

        Public Function Search(ByVal data As T) As T
        Return Me.Search(data, Me.mRoot)
        End Function

        Private Function Search(ByVal data As T, ByVal node As TreeNode) As T

        If node Is Nothing Then
        Return Nothing
        Else
        Dim result As Integer = data.CompareTo( node.Data) '****** this
        is the error I get on this line :Object must be of type String.

        If result = 0 Then
        Return node.Data
        ElseIf result < 0 Then
        Return Me.Search(data, node.LeftNode)
        Else
        Return Me.Search(data, node.RightNode)
        End If
        End If

        Note that Search returns type T; this ensures that BinarySearchTre e(Of T) is
        type safe and performant. performant in that the data will not be boxed. (in
        the case of BinarySearchTre e(Of Integer))

        Although I would recommend defining Search as:

        Public Function Search(ByVal match As Predicate(Of T)) As T

        Or even:

        Public Delegate Function Predicate(Of T, V)(ByVal obj As T, ByVal value
        As V) As Boolean

        Public Function Search(Of V)(ByVal value As V, ByVal match As
        Predicate(Of T, V)) As T

        Which I will leave as an exercise for you to complete...

        --
        Hope this helps
        Jay B. Harlow
        ..NET Application Architect, Enthusiast, & Evangelist
        T.S. Bradley - http://www.tsbradley.net


        "Jay B. Harlow" <Jay_Harlow_MVP @tsbradley.netw rote in message
        news:eIm21joKHH A.3268@TK2MSFTN GP04.phx.gbl...
        BenCoo,
        Interesting homework assignment; I miss those days...
        >
        Anyway to answer your question:
        >
        > Dim bstLedenLijst As New BinarySearchTre e
        > Dim bstLidnummer As New BinarySearchTre e
        > Dim txtOutput As String = ""
        >>
        > bstLidnummer.Ad d("5")
        > txtOutput = bstLidnummer.Se arch("3") & vbCrLf
        >>
        > bstLedenLijst.A dd(New Persoon("Nicole ", "Kidman"))
        >>
        > txtOutput &= bstLedenLijst.S earch("Demi") ' & vbCrLf
        >
        Ah! There's the Rub!
        >
        bstLedenLijst contains a collection of Persoon objects, you are attempting
        to compare Persoon objects to a String object! You need to pass a Persoon
        object to bstLedenLijst.S earch. I would recommend you change
        BinarySearchTre e to a Generic class; changing this obscure runtime error
        into an obvious compile time error!
        >
        Something like:
        >
        Public Class BinarySearchTre e(Of T As IComparable)
        >
        Private Class TreeNode
        Private mData As T
        Private mLeftNode As TreeNode
        Private mRightNode As TreeNode
        >
        Public Sub New(ByVal data As T)
        Me.mData = data
        End Sub
        >
        Public ReadOnly Property Data() As T
        Get
        Return Me.mData
        End Get
        End Property
        >
        Public Property LeftNode() As TreeNode
        Get
        Return Me.mLeftNode
        End Get
        Set(ByVal value As TreeNode)
        Me.mLeftNode = value
        End Set
        End Property
        >
        Public Property RightNode() As TreeNode
        Get
        Return Me.mRightNode
        End Get
        Set(ByVal value As TreeNode)
        Me.mRightNode = value
        End Set
        End Property
        >
        Public Sub Add(ByVal data As T)
        If data.CompareTo( Me.mData) <= 0 Then
        If Me.mLeftNode Is Nothing Then
        Me.mLeftNode = New TreeNode(data)
        Else
        Me.mLeftNode.Ad d(data)
        End If
        Else
        If Me.mRightNode Is Nothing Then
        Me.mRightNode = New TreeNode(data)
        Else
        Me.mRightNode.A dd(data)
        End If
        End If
        End Sub
        End Class
        >
        Private mRoot As TreeNode
        >
        Public Sub Add(ByVal data As T)
        If mRoot Is Nothing Then
        mRoot = New TreeNode(data)
        Else
        mRoot.Add(data)
        End If
        End Sub
        >
        Public Function Search(ByVal data As T) As Object
        Return Me.Search(data, Me.mRoot)
        End Function
        >
        Private Function Search(ByVal data As T, ByVal node As TreeNode) As
        Object
        >
        If node Is Nothing Then
        Return Nothing
        Else
        Dim result As Integer = data.CompareTo( node.Data) '****** this
        is the error I get on this line :Object must be of type String.
        >
        If result = 0 Then
        Return node.Data
        ElseIf result < 0 Then
        Return Me.Search(data, node.LeftNode)
        Else
        Return Me.Search(data, node.RightNode)
        End If
        End If
        >
        End Function
        End Class
        >
        Then when you define your trees, you give the type of tree they are!
        >
        > Dim bstLedenLijst As New BinarySearchTre e(Of String)
        > Dim bstLidnummer As New BinarySearchTre e(Of Persoon)
        >
        NOTE: You need VS 2005 for generics.
        >
        --
        Hope this helps
        Jay B. Harlow
        .NET Application Architect, Enthusiast, & Evangelist
        T.S. Bradley - http://www.tsbradley.net
        >
        >
        "BenCoo" <teddyb58@hotma il.comwrote in message
        news:CNPkh.2608 24$tk1.5394486@ phobos.telenet-ops.be...
        >Hello,
        >>
        >In a Binary Search Tree I get the error : Object must be of type String
        >>
        >if I run the form only with the "Dim bstLidnummer As New
        >BinarySearchTr ee"
        >it works fine.
        >>
        >Thanks for any help on this,
        >>
        >Benny
        >>
        >My BST-code lookes lokes this :
        >************** *************** *************** ******
        >Class BST
        >************** *************** *************** ******
        >Public Class BinarySearchTre e
        > Private Class TreeNode
        > Private mData As IComparable
        > Private mLeftNode As TreeNode
        > Private mRightNode As TreeNode
        >>
        > Public Sub New(ByVal data As IComparable)
        > Me.mData = data
        > End Sub
        >>
        > Public ReadOnly Property Data() As IComparable
        > Get
        > Return Me.mData
        > End Get
        > End Property
        >>
        > Public Property LeftNode() As TreeNode
        > Get
        > Return Me.mLeftNode
        > End Get
        > Set(ByVal value As TreeNode)
        > Me.mLeftNode = value
        > End Set
        > End Property
        >>
        > Public Property RightNode() As TreeNode
        > Get
        > Return Me.mRightNode
        > End Get
        > Set(ByVal value As TreeNode)
        > Me.mRightNode = value
        > End Set
        > End Property
        >>
        > Public Sub Add(ByVal data As IComparable)
        > If data.CompareTo( Me.mData) <= 0 Then
        > If Me.mLeftNode Is Nothing Then
        > Me.mLeftNode = New TreeNode(data)
        > Else
        > Me.mLeftNode.Ad d(data)
        > End If
        > Else
        > If Me.mRightNode Is Nothing Then
        > Me.mRightNode = New TreeNode(data)
        > Else
        > Me.mRightNode.A dd(data)
        > End If
        > End If
        > End Sub
        > End Class
        >>
        > Private mRoot As TreeNode
        >>
        > Public Sub Add(ByVal data As IComparable)
        > If mRoot Is Nothing Then
        > mRoot = New TreeNode(data)
        > Else
        > mRoot.Add(data)
        > End If
        > End Sub
        >>
        > Public Function Search(ByVal data As IComparable) As Object
        > Return Me.Search(data, Me.mRoot)
        > End Function
        >>
        > Private Function Search(ByVal data As IComparable, ByVal node As
        >TreeNode) As Object
        >>
        > If node Is Nothing Then
        > Return Nothing
        > Else
        > Dim result As Integer = data.CompareTo( node.Data) '****** this
        >is
        >the error I get on this line :Object must be of type String.
        >>
        > If result = 0 Then
        > Return node.Data
        > ElseIf result < 0 Then
        > Return Me.Search(data, node.LeftNode)
        > Else
        > Return Me.Search(data, node.RightNode)
        > End If
        > End If
        >>
        > End Function
        >End Class
        >************** ***************
        >The class Person
        >************** ***************
        >Public Class Persoon
        > Inherits BusinessObject
        > Implements IComparable
        >>
        > Private mVnaam As String
        > Private mAnaam As String
        >>
        > Public Sub New(ByVal Vnaam As String, ByVal Anaam As String)
        > Me.mVnaam = Vnaam
        > Me.mAnaam = Anaam
        > End Sub
        >>
        > Public Property Vnaam() As String
        > Get
        > Return Me.mVnaam
        > End Get
        > Set(ByVal value As String)
        > mVnaam = value
        > End Set
        > End Property
        >>
        > Public Property Anaam() As String
        > Get
        > Return Me.mAnaam
        > End Get
        > Set(ByVal value As String)
        > Me.mAnaam = value
        > End Set
        > End Property
        >>
        > Public Overrides Function IsValid() As Boolean
        > If Me.isValidVnaam () And Me.isValidAnaam () Then
        > Return True
        > Else
        > Return False
        > End If
        > End Function
        >>
        > Private Function isValidVnaam() As Boolean
        > If Me.Vnaam.Trim.L ength 0 Then
        > Return True
        > Else
        > Return False
        > End If
        > End Function
        >>
        > Private Function isValidAnaam() As Boolean
        > If Me.Anaam.Trim.L ength 0 Then
        > Return True
        > Else
        > Return False
        > End If
        > End Function
        >>
        > Public Overloads Function CompareTo(ByVal obj As Object) As Integer
        >Implements System.ICompara ble.CompareTo
        > Return Me.mVnaam.Compa reTo(CType(obj, Persoon).Vnaam)
        > End Function
        >End Class
        >************** *************** *****
        >The Form :
        >************** *************** *****
        >Public Class frmBinarySearch Tree
        >>
        > Private Sub btnExecute_Clic k(ByVal sender As System.Object, ByVal e As
        >System.EventAr gs) Handles btnExecute.Clic k
        > Dim bstLedenLijst As New BinarySearchTre e
        > Dim bstLidnummer As New BinarySearchTre e
        > Dim txtOutput As String = ""
        >>
        > bstLidnummer.Ad d("5")
        > bstLidnummer.Ad d("2")
        > bstLidnummer.Ad d("1")
        > bstLidnummer.Ad d("4")
        > bstLidnummer.Ad d("3")
        > txtOutput = bstLidnummer.Se arch("3") & vbCrLf
        >>
        > bstLedenLijst.A dd(New Persoon("Nicole ", "Kidman"))
        > bstLedenLijst.A dd(New Persoon("Jamie-Lee", "Curtis"))
        > bstLedenLijst.A dd(New Persoon("Demi", "Moore"))
        > bstLedenLijst.A dd(New Persoon("Julia" , "Roberts"))
        > bstLedenLijst.A dd(New Persoon("Andie" , "MacDowell" ))
        >>
        > txtOutput &= bstLedenLijst.S earch("Demi") ' & vbCrLf
        >>
        > Me.txtOutput.Te xt = txtOutput
        >>
        > End Sub
        >>
        > Private Sub btnExit_Click(B yVal sender As System.Object, ByVal e As
        >System.EventAr gs) Handles btnExit.Click
        > Application.Exi t()
        > End Sub
        >>
        >End Class
        >>
        >>
        >>
        >

        Comment

        • BenCoo

          #5
          Re: Binary Search Tree - CompareTo Error

          Thank you for your quick response; I solved afther the poste was made the
          promlem this way ..

          Dim zoekPersoon As New Persoon(Me.txtZ oek.Text, "")

          Console.WriteLi ne(bstLedenLijs t.Search(zoekPe rsoon))





          "Jay B. Harlow" <Jay_Harlow_MVP @tsbradley.nets chreef in bericht
          news:eIm21joKHH A.3268@TK2MSFTN GP04.phx.gbl...
          BenCoo,
          Interesting homework assignment; I miss those days...
          >
          Anyway to answer your question:
          >
          > Dim bstLedenLijst As New BinarySearchTre e
          > Dim bstLidnummer As New BinarySearchTre e
          > Dim txtOutput As String = ""
          >>
          > bstLidnummer.Ad d("5")
          > txtOutput = bstLidnummer.Se arch("3") & vbCrLf
          >>
          > bstLedenLijst.A dd(New Persoon("Nicole ", "Kidman"))
          >>
          > txtOutput &= bstLedenLijst.S earch("Demi") ' & vbCrLf
          >
          Ah! There's the Rub!
          >
          bstLedenLijst contains a collection of Persoon objects, you are attempting
          to compare Persoon objects to a String object! You need to pass a Persoon
          object to bstLedenLijst.S earch. I would recommend you change
          BinarySearchTre e to a Generic class; changing this obscure runtime error
          into an obvious compile time error!
          >
          Something like:
          >
          Public Class BinarySearchTre e(Of T As IComparable)
          >
          Private Class TreeNode
          Private mData As T
          Private mLeftNode As TreeNode
          Private mRightNode As TreeNode
          >
          Public Sub New(ByVal data As T)
          Me.mData = data
          End Sub
          >
          Public ReadOnly Property Data() As T
          Get
          Return Me.mData
          End Get
          End Property
          >
          Public Property LeftNode() As TreeNode
          Get
          Return Me.mLeftNode
          End Get
          Set(ByVal value As TreeNode)
          Me.mLeftNode = value
          End Set
          End Property
          >
          Public Property RightNode() As TreeNode
          Get
          Return Me.mRightNode
          End Get
          Set(ByVal value As TreeNode)
          Me.mRightNode = value
          End Set
          End Property
          >
          Public Sub Add(ByVal data As T)
          If data.CompareTo( Me.mData) <= 0 Then
          If Me.mLeftNode Is Nothing Then
          Me.mLeftNode = New TreeNode(data)
          Else
          Me.mLeftNode.Ad d(data)
          End If
          Else
          If Me.mRightNode Is Nothing Then
          Me.mRightNode = New TreeNode(data)
          Else
          Me.mRightNode.A dd(data)
          End If
          End If
          End Sub
          End Class
          >
          Private mRoot As TreeNode
          >
          Public Sub Add(ByVal data As T)
          If mRoot Is Nothing Then
          mRoot = New TreeNode(data)
          Else
          mRoot.Add(data)
          End If
          End Sub
          >
          Public Function Search(ByVal data As T) As Object
          Return Me.Search(data, Me.mRoot)
          End Function
          >
          Private Function Search(ByVal data As T, ByVal node As TreeNode) As
          Object
          >
          If node Is Nothing Then
          Return Nothing
          Else
          Dim result As Integer = data.CompareTo( node.Data) '****** this
          is the error I get on this line :Object must be of type String.
          >
          If result = 0 Then
          Return node.Data
          ElseIf result < 0 Then
          Return Me.Search(data, node.LeftNode)
          Else
          Return Me.Search(data, node.RightNode)
          End If
          End If
          >
          End Function
          End Class
          >
          Then when you define your trees, you give the type of tree they are!
          >
          > Dim bstLedenLijst As New BinarySearchTre e(Of String)
          > Dim bstLidnummer As New BinarySearchTre e(Of Persoon)
          >
          NOTE: You need VS 2005 for generics.
          >
          --
          Hope this helps
          Jay B. Harlow
          .NET Application Architect, Enthusiast, & Evangelist
          T.S. Bradley - http://www.tsbradley.net
          >
          >
          "BenCoo" <teddyb58@hotma il.comwrote in message
          news:CNPkh.2608 24$tk1.5394486@ phobos.telenet-ops.be...
          >Hello,
          >>
          >In a Binary Search Tree I get the error : Object must be of type String
          >>
          >if I run the form only with the "Dim bstLidnummer As New
          >BinarySearchTr ee"
          >it works fine.
          >>
          >Thanks for any help on this,
          >>
          >Benny
          >>
          >My BST-code lookes lokes this :
          >************** *************** *************** ******
          >Class BST
          >************** *************** *************** ******
          >Public Class BinarySearchTre e
          > Private Class TreeNode
          > Private mData As IComparable
          > Private mLeftNode As TreeNode
          > Private mRightNode As TreeNode
          >>
          > Public Sub New(ByVal data As IComparable)
          > Me.mData = data
          > End Sub
          >>
          > Public ReadOnly Property Data() As IComparable
          > Get
          > Return Me.mData
          > End Get
          > End Property
          >>
          > Public Property LeftNode() As TreeNode
          > Get
          > Return Me.mLeftNode
          > End Get
          > Set(ByVal value As TreeNode)
          > Me.mLeftNode = value
          > End Set
          > End Property
          >>
          > Public Property RightNode() As TreeNode
          > Get
          > Return Me.mRightNode
          > End Get
          > Set(ByVal value As TreeNode)
          > Me.mRightNode = value
          > End Set
          > End Property
          >>
          > Public Sub Add(ByVal data As IComparable)
          > If data.CompareTo( Me.mData) <= 0 Then
          > If Me.mLeftNode Is Nothing Then
          > Me.mLeftNode = New TreeNode(data)
          > Else
          > Me.mLeftNode.Ad d(data)
          > End If
          > Else
          > If Me.mRightNode Is Nothing Then
          > Me.mRightNode = New TreeNode(data)
          > Else
          > Me.mRightNode.A dd(data)
          > End If
          > End If
          > End Sub
          > End Class
          >>
          > Private mRoot As TreeNode
          >>
          > Public Sub Add(ByVal data As IComparable)
          > If mRoot Is Nothing Then
          > mRoot = New TreeNode(data)
          > Else
          > mRoot.Add(data)
          > End If
          > End Sub
          >>
          > Public Function Search(ByVal data As IComparable) As Object
          > Return Me.Search(data, Me.mRoot)
          > End Function
          >>
          > Private Function Search(ByVal data As IComparable, ByVal node As
          >TreeNode) As Object
          >>
          > If node Is Nothing Then
          > Return Nothing
          > Else
          > Dim result As Integer = data.CompareTo( node.Data) '****** this
          >is
          >the error I get on this line :Object must be of type String.
          >>
          > If result = 0 Then
          > Return node.Data
          > ElseIf result < 0 Then
          > Return Me.Search(data, node.LeftNode)
          > Else
          > Return Me.Search(data, node.RightNode)
          > End If
          > End If
          >>
          > End Function
          >End Class
          >************** ***************
          >The class Person
          >************** ***************
          >Public Class Persoon
          > Inherits BusinessObject
          > Implements IComparable
          >>
          > Private mVnaam As String
          > Private mAnaam As String
          >>
          > Public Sub New(ByVal Vnaam As String, ByVal Anaam As String)
          > Me.mVnaam = Vnaam
          > Me.mAnaam = Anaam
          > End Sub
          >>
          > Public Property Vnaam() As String
          > Get
          > Return Me.mVnaam
          > End Get
          > Set(ByVal value As String)
          > mVnaam = value
          > End Set
          > End Property
          >>
          > Public Property Anaam() As String
          > Get
          > Return Me.mAnaam
          > End Get
          > Set(ByVal value As String)
          > Me.mAnaam = value
          > End Set
          > End Property
          >>
          > Public Overrides Function IsValid() As Boolean
          > If Me.isValidVnaam () And Me.isValidAnaam () Then
          > Return True
          > Else
          > Return False
          > End If
          > End Function
          >>
          > Private Function isValidVnaam() As Boolean
          > If Me.Vnaam.Trim.L ength 0 Then
          > Return True
          > Else
          > Return False
          > End If
          > End Function
          >>
          > Private Function isValidAnaam() As Boolean
          > If Me.Anaam.Trim.L ength 0 Then
          > Return True
          > Else
          > Return False
          > End If
          > End Function
          >>
          > Public Overloads Function CompareTo(ByVal obj As Object) As Integer
          >Implements System.ICompara ble.CompareTo
          > Return Me.mVnaam.Compa reTo(CType(obj, Persoon).Vnaam)
          > End Function
          >End Class
          >************** *************** *****
          >The Form :
          >************** *************** *****
          >Public Class frmBinarySearch Tree
          >>
          > Private Sub btnExecute_Clic k(ByVal sender As System.Object, ByVal e As
          >System.EventAr gs) Handles btnExecute.Clic k
          > Dim bstLedenLijst As New BinarySearchTre e
          > Dim bstLidnummer As New BinarySearchTre e
          > Dim txtOutput As String = ""
          >>
          > bstLidnummer.Ad d("5")
          > bstLidnummer.Ad d("2")
          > bstLidnummer.Ad d("1")
          > bstLidnummer.Ad d("4")
          > bstLidnummer.Ad d("3")
          > txtOutput = bstLidnummer.Se arch("3") & vbCrLf
          >>
          > bstLedenLijst.A dd(New Persoon("Nicole ", "Kidman"))
          > bstLedenLijst.A dd(New Persoon("Jamie-Lee", "Curtis"))
          > bstLedenLijst.A dd(New Persoon("Demi", "Moore"))
          > bstLedenLijst.A dd(New Persoon("Julia" , "Roberts"))
          > bstLedenLijst.A dd(New Persoon("Andie" , "MacDowell" ))
          >>
          > txtOutput &= bstLedenLijst.S earch("Demi") ' & vbCrLf
          >>
          > Me.txtOutput.Te xt = txtOutput
          >>
          > End Sub
          >>
          > Private Sub btnExit_Click(B yVal sender As System.Object, ByVal e As
          >System.EventAr gs) Handles btnExit.Click
          > Application.Exi t()
          > End Sub
          >>
          >End Class
          >>
          >>
          >>
          >

          Comment

          Working...