Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Public Class Trie(Of T)
- Private Node As New TrieNode(Of T)
- Private Class TrieNode(Of U)
- Public Item As U = Nothing
- Public Values() As TrieNode(Of T)
- Public Shared Widening Operator CType(ByVal U As TrieNode(Of U)) As U
- Return U.Item
- End Operator
- End Class
- Default Public Property Item(ByVal Keys As String()) As T
- Get
- Dim ph As TrieNode(Of T) = Node
- For Each str As String In Keys
- ph = ph.Values(0)
- For i = 0 To str.Length - 1
- ph = ph.Values(AscW(str(i)) - 96)
- Next
- Next
- Return ph.Item
- End Get
- Set(Value As T)
- Dim ph As TrieNode(Of T) = Node
- For Each str As String In Keys
- If ph.Values Is Nothing Then
- ph.Values = New TrieNode(Of T)(26) {}
- ph.Values(0) = New TrieNode(Of T)
- Else
- If ph.Values(0) Is Nothing Then ph.Values(0) = New TrieNode(Of T)
- End If
- ph = ph.Values(0)
- For i = 0 To str.Length - 1
- Dim v As Integer = AscW(str(i)) - 96
- If ph.Values Is Nothing Then
- ph.Values = New TrieNode(Of T)(26) {}
- ph.Values(v) = New TrieNode(Of T)
- Else
- If ph.Values(v) Is Nothing Then ph.Values(v) = New TrieNode(Of T)
- End If
- ph = ph.Values(v)
- Next
- Next
- ph.Item = Value
- End Set
- End Property
- Public Function TryGet(ByRef Result As T, ParamArray ByVal Keys As String()) As Boolean
- Try
- Dim ph As TrieNode(Of T) = Node
- If Keys.Length = 1 Then
- Dim firstKey As String = Keys(0)
- For i = 0 To firstKey.Length - 1
- ph = ph.Values(AscW(firstKey(i)) - 96)
- Next
- Else
- For Each str As String In Keys
- For i = 0 To str.Length - 1
- ph = ph.Values(AscW(str(i)) - 96)
- Next
- Next
- End If
- Result = ph.Item
- Return True
- Catch
- Return False
- End Try
- End Function
- End Class
Advertisement
Add Comment
Please, Sign In to add comment