Visual Basic.NET - Comprimir cadena

 
Vista:
sin imagen de perfil
Val: 33
Ha aumentado su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Comprimir cadena

Publicado por Carlos (21 intervenciones) el 08/10/2018 14:43:45
Hola a tod@s

Estoy intentando implementar una función que comprima strings largos y devuelva un string más reducido. Por ejemplo si tuviera el siguiente string,:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCC

Debería devolver un string como este:

A30B20C7

Puesto que, si no he cometido algún error al contar yo, hay 30 aes, 20 bes y 7 ces.

Estoy intentando hacer esta función pero da error:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Function comprime(c As String) As String
    Dim l As Int64 = c.Length
    Dim ci As Int16 = 0  'caracteres iguales contiguos
    Dim sb As New System.Text.StringBuilder, s As String
    Select Case l
        Case l <= 1
            Return c
            Exit Function
        Case Else
            Dim uc As Char, r As Int16
            For i = 1 To c.Length
                While i < c.Length
                    i += 1
                    While uc = Mid(c, i, 1)
                        ci += 1
                    End While
                    uc = Microsoft.VisualBasic.Mid(c, i, 1)
                End While
                sb.Append(uc, ci)
            Next
    End Select
    Return sb.ToString
End Function
pero da error System.OverflowException

Acepto tanto correcciones de código como una función nueva.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Comprimir cadena

Publicado por kingk (77 intervenciones) el 08/10/2018 17:11:25
Hola en tu codigo se crearia un bucle infinito y ahi esta parte del error. Esta sera una forma mas simple:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Function comprime(c As String) As String
Dim l As Int64 = c.Length
Dim ci As Int16 = 0 'caracteres iguales contiguos
Dim sb As New System.Text.StringBuilder, s As String
If l <= 1 Then
Return c
Exit Function
Else
Dim uc As Char, r As Int16
uc=c(0)
For i = 0 To c.Length-1
If uc=c(i) Then
ci += 1
Else
sb.Append(uc, ci)
uc=c(i)
ci=1
End If
Next
Return sb.ToString()
End If
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar