如何在字典中存储2个相同的项目

时间:2016-10-18 10:36:26

标签: vb.net

我需要在字典中存储两次相同的项目,因为我说这句话:'嗨示例测试嗨'这应该输出1,2,3,1,因为它需要用单词存储初始位置。这是我到目前为止的代码:

If System.Text.RegularExpressions.Regex.IsMatch(userInput.Text, "^[a-zA-Z\s]+$") Then

        Dim userString As String = userInput.Text 'Refers to the textbox's text.
        Dim count As Integer 'Declares the count variable, which will be added to the dictionary as the word's position.
        Dim d As New Dictionary(Of String, Integer) 'Declares the dictionary I will iterate through in the future.
        Dim d2 As New Dictionary(Of String, Integer)
        Dim wordString = userString.ToLower().Split(" "c) 'Puts the input into lower case and splits it apart by detecting each space after each word.

        For Each word In wordString

            If (d.ContainsKey(word)) Then

            Else
                d.Add(word, count) 'Adds each word to the dictionary along with the position.
                count = count + 1 'Adds to the count variable to iterate through the dictionary.
            End If
        Next

        For Each de In d
            For Each dee In d2
                output.Text &= de.Value + 1 & ", " & dee.Value + 1 & ", " & Environment.NewLine 'Gathers each word from the dictionary, referencing it by using 'de' and retrieving the key and value.
            Next
        Next

    Else

        MessageBox.Show("Your Sentence Is Invalid, It Must Only Contains Letters.") 'Displays a message if the sentence they inputted is invalid.

    End If

感谢,

马特

1 个答案:

答案 0 :(得分:0)

可能是这样的:

Dim userString As String = "Hi Example Test Hi"
Dim count As Integer = 1 'Declares the count variable, which will be added to the dictionary as the word's position.
Dim d As New List(Of WordCountPos) 'Declares the dictionary I will iterate through in the future.
Dim wordString = userString.ToLower().Split(" "c) 'Puts the input into lower case and splits it apart by detecting each space after each word.

For Each word In wordString

    If d.FindIndex(Function(x) String.Equals(x.Word, word)) <> -1 Then

        d.Find(Function(x) String.Equals(x.Word, word)).Positions.Add(count)

    Else

        d.Add(New WordCountPos(word, 1, New List(Of Integer)({count}))) 'Adds each word to the dictionary along with the position

    End If

    count = count + 1 'Adds to the count variable to iterate through the dictionary.

Next

Dim output As String = ""
For Each de In d
    output = String.Concat(output, Environment.NewLine, "Word: ", de.Word, " Count: ", de.Count, ", Positions:", String.Join("|", de.Positions.ToArray))
Next
Console.WriteLine(output)

类别:

Public Class WordCountPos

    Public Sub New(w As String, c As String, pos As List(Of Integer))

        Me.wcp_w = w
        Me.wcp_c = c
        Me.wcp_pos = pos

    End Sub

    Private wcp_w As String
    Public Property Word() As String
        Get
            Return wcp_w
        End Get
        Set(ByVal value As String)
            wcp_w = value
        End Set
    End Property

    Private wcp_c As Integer
    Public Property Count() As Integer
        Get
            Return wcp_c
        End Get
        Set(ByVal value As Integer)
            wcp_c = value
        End Set
    End Property

    Private wcp_pos As List(Of Integer)
    Public Property Positions() As List(Of Integer)
        Get
            Return wcp_pos
        End Get
        Set(ByVal value As List(Of Integer))
            wcp_pos = value
        End Set
    End Property

End Class