Удаление повторяющейся цифры из строки (т.е. сделать 660 = 60)

У меня есть проект vb.net на Soundex. Для тех, кто не знает, Soundex берет введенное вами слово и экспортирует его в буквы и цифры.

Например:

Слово: морковь

Выход: C663

Мне поручено удалить вторую цифру, если они находятся рядом друг с другом и являются одним и тем же числом. Так что для этого примера C663 просто нужно вывести как C63. Я не могу понять это. Я пытался использовать предложение Distinct, но я просто не могу понять это.

Вот мой код, буду признателен за любую помощь.

Public Class Form1

Dim Word As String

Private Sub btnEncode_Click(sender As Object, e As EventArgs) Handles btnEncode.Click

    Word = txtInput.Text
    txtOutput.Text = Output(Word)

End Sub

Public Function Output(Word As String) As String

    Return Output(Word, 4)

End Function

Public Function Output(Word As String, Length As Integer) As String

    Dim returnValue As String = ""

    Dim Size As Integer = Word.Length

    If (Size > 1) Then

        Word = Word.ToUpper()

        Dim Chars() As Char = Word.ToCharArray()
        Dim i As Integer
        Dim wordSize As Integer = Size - 1
        Dim value As Integer
        Dim newString As New System.Text.StringBuilder

        newString.Append(Chars(0))

        For i = 1 To wordSize
            Select Case Chars(i)
                Case "A", "E", "I", "O", "U", "H", "W", "Y"
                    value = 0
                Case "B", "F", "P", "V"
                    value = 1
                Case "C", "G", "J", "K", "Q", "S", "X", "Z"
                    value = 2
                Case "D", "T"
                    value = 3
                Case "L"
                    value = 4
                Case "M", "N"
                    value = 5
                Case "R"
                    value = 6
            End Select

            If value <> 0 Then
                newString.Append(value)
            End If

        Next

    End If

    Return returnValue
End Function
End Class

person Community    schedule 21.03.2018    source источник
comment
Есть несколько методов, которые можно использовать для управления этим; тот, который я бы использовал, должен был бы сохранить ранее найденное значение, и если новое значение соответствует предыдущему, фактически не добавляйте его в строку.   -  person Jeff Zeitlin    schedule 21.03.2018
comment
Вам нужен оператор if для проверки предшествующего символа. Вам также не нужен построитель строк, поскольку коды Soundex состоят всего из 4 символов. Пройдите тур и прочитайте Как Спросить   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.03.2018


Ответы (2)


Просто проверьте символ в текущем цикле. Вот рабочая функция, демонстрирующая, что вам нужно сделать.

Public Function Output(Word As String, Length As Integer) As String

    Dim returnValue As String = String.Empty

    Dim Size As Integer = Word.Length

    If (Size > 1) Then

        Word = Word.ToUpper()

        Dim Chars() As Char = Word.ToUpper().ToCharArray()
        Dim value As Char
        Dim newString As New System.Text.StringBuilder

        newString.Append(Chars(0))

        For i = 1 To Size - 1
            Select Case Chars(i)
                Case "A", "E", "I", "O", "U", "H", "W", "Y"
                    value = "0"c
                Case "B", "F", "P", "V"
                    value = "1"c
                Case "C", "G", "J", "K", "Q", "S", "X", "Z"
                    value = "2"c
                Case "D", "T"
                    value = "3"c
                Case "L"
                    value = "4"c
                Case "M", "N"
                    value = "5"c
                Case "R"
                    value = "6"c
            End Select

            If value <> "0" Then
                If newString.Length > 0 AndAlso newString(newString.Length - 1) = value Then
                    Continue For
                End If
                newString.Append(value)
            End If

        Next

        returnValue = newString.ToString()

    End If

    Return returnValue
End Function
person Ryan Gunn    schedule 21.03.2018
comment
Большое спасибо за ответ, это очень ценно. Я довольно новый программист. Могу я спросить вас, такая логика приходит со временем или это естественная способность? VB.NET - мой первый язык, и я только около 2 месяцев. Каждый раз, когда я вижу решение, я прекрасно понимаю его, я просто не могу понять его правильно, не спросив. Большое спасибо за ответ! - person ; 21.03.2018

Используйте цикл, чтобы проверить каждый символ, чтобы увидеть, находятся ли они рядом друг с другом и одинаковы, если это так, не добавляйте символ в новую строку:

Public Function Output(Word As String, Length As Integer) As String

Dim returnValue As String = ""

Dim Size As Integer = Word.Length
'initialize temp string to first character of word
Dim newcondensedWord AS String = Word(0)
'Loop starting at index 1 or second character compare each character to previous during loop, if the same continue else append to variable newcondensedWord
FOR i AS Integer = 1 TO Word.Length - 1
     Dim temp as CHAR = Word(i - 1)
     IF Word(i) = Word(i - 1) THEN
          Continue
     ELSE
          newcondensedWord += Word(i)
     END IF
NEXT

'Now that we have removed the characters that are duplicates and adjacents set word equal to the condensed word
Word = newcondensedWord
person Ryan Wilson    schedule 21.03.2018