none
Como realizar una busqueda en una cadena y mostrar la cantidad de letras que se repiten en la cadena y la posicion de cada letra

    Pregunta

  •     Private Sub btnbuscar_Click(sender As Object, e As EventArgs) Handles btnbuscar.Click
            For i = 0 To Len(txtcadena.Text)
                txtbusqueda.Text = InStr(txtcadena.Text, txtletra.Text)
            Next
        End Sub

    End Class

    en el txtletra escribo la letra a buscar y en txtbusqueda me aparese solo una ubicacion ejemplo la palabra Somos busco la letra "o" y solo me aparece una ubicacion.

    domingo, 18 de septiembre de 2016 18:42

Respuestas

  • Hola Ariel2294,

    [-] ... Como realizar una busqueda en una cadena y mostrar la cantidad de letras que se repiten en la cadena y la posicion de cada letra..

    También podrías hacer uso del SubString 

    Algo como esto :

    Private Sub btnbuscar_Click(sender As Object, e As EventArgs) Handles btnbuscar.Click
            Dim cant As Integer = 0
            Dim result As String = String.Empty
    
            For i = 0 To Len(txtcadena.Text) - 1
                If txtcadena.Text.Substring(i, 1) = txtletra.Text Then
                    result += String.Format("[pos : {0} ]", i) & Environment.NewLine
                    cant += 1
                End If
            Next
    
            result += "Cantidad : " & cant
            txtbusqueda.Text = result
        End Sub


    Resultado :

    Recomendaría no concatenar directamente lo valores al TextBox, sino crear una variable que almacene todo y posteriormente asignarla.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 18 de septiembre de 2016 19:44
  • Ariel2294,

    La idea del ejercicio es contener o acumular los valores que vas recuperando y es algo que no estás realizando, para conseguir el objetivo podrías valerte del operador '+='.

    Por otro lado, para recuperar la posición de un caracter dentro de la cadena podrías aprovechar la variable que recorre la cantidad de elementos (i) y sólo realizar la comparación:

    For i As Integer = 0 To txtcadena.Length - 1
            If txtletra.Text = cadena(i) Then txtbusqueda.Text += String.Concat(i.ToString, ",")
    Next


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 18 de septiembre de 2016 19:22

Todas las respuestas

  • Lógico, en todas las iteraciones del bucle estás ejecutando exactamente la misma instrucción:

    txtbusqueda.Text = InStr(txtcadena.Text, txtletra.Text)

    Que significa "Quiero buscar LA PRIMERA ocurrencia de txtletra.Text dentro de txtcadena.Text". Y eso lo repites tantas veces como sea la longitud de txtcadena, y lógicamente todas devuelven el mismo resultado, que machacas una vez tras otra dentro de txtbusqueda (el cual siempre muestra lo mismo porque a cada vuelta del bucle lo vuelves a escribir).

    Para buscar LA SIGUIENTE ocurrencia (en lugar de la primera) se usa una sobrecarga del IndexOf (acostúmbrate a usarlo en lugar de InStr, el InStr es la variante obsoleta que se usaba en el antiguo VB) que tiene un parámetro extra que indica la posición de inicio de la búsqueda:

    Dim siguienteOcurrencia as Integer = txtcadena.Text.IndexOf(txtCadena.Text, anteriorOcurrencia+1)

    Como es natural, la variable "anteriorOcurrencia" tienes que cargarla a cada iteración del bucle con el último valor de "siguienteOcurrencia", y el valor de siguienteOcurrencia tienes que CONCATENARLO en txtBusqueda.Text (no sobreescribir lo que había antes en txtBusqueda.Text porque entonces solo verías el último valor encontrado). Y tienes que repetir hasta que la posición sea mayor que la longitud de la cadena o hasta que devuelva -1 que significa que no lo ha encontrado (no repetir un bucle con todos los caracteres de la cadena).

    Y sí, eso significa que tienes que escribir varias instrucciones más dentro de tu programa, pero no podemos ponértelas aquí, sino solo darte unas pistas como las anteriores, debido a que tiene toda la pinta de ser un ejercicio académico, con lo cual sería "hacer trampa" si te diéramos la solución final ya terminada y lista para ejecutar.

    domingo, 18 de septiembre de 2016 19:08
  • Ariel2294,

    La idea del ejercicio es contener o acumular los valores que vas recuperando y es algo que no estás realizando, para conseguir el objetivo podrías valerte del operador '+='.

    Por otro lado, para recuperar la posición de un caracter dentro de la cadena podrías aprovechar la variable que recorre la cantidad de elementos (i) y sólo realizar la comparación:

    For i As Integer = 0 To txtcadena.Length - 1
            If txtletra.Text = cadena(i) Then txtbusqueda.Text += String.Concat(i.ToString, ",")
    Next


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 18 de septiembre de 2016 19:22
  • Hola Ariel2294,

    [-] ... Como realizar una busqueda en una cadena y mostrar la cantidad de letras que se repiten en la cadena y la posicion de cada letra..

    También podrías hacer uso del SubString 

    Algo como esto :

    Private Sub btnbuscar_Click(sender As Object, e As EventArgs) Handles btnbuscar.Click
            Dim cant As Integer = 0
            Dim result As String = String.Empty
    
            For i = 0 To Len(txtcadena.Text) - 1
                If txtcadena.Text.Substring(i, 1) = txtletra.Text Then
                    result += String.Format("[pos : {0} ]", i) & Environment.NewLine
                    cant += 1
                End If
            Next
    
            result += "Cantidad : " & cant
            txtbusqueda.Text = result
        End Sub


    Resultado :

    Recomendaría no concatenar directamente lo valores al TextBox, sino crear una variable que almacene todo y posteriormente asignarla.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 18 de septiembre de 2016 19:44
  • Gracias por por tu aporte me ayudado mucho. Saludos
    domingo, 18 de septiembre de 2016 20:20
  • Gracias tu solucion me ayudo mucho en mi problema y con la atuda de vosotros lo he solucionado
    domingo, 18 de septiembre de 2016 20:21
  • Muy exelente su explicacion y eso de usar instr no sabia que ya era obsoleto gracia por la ayuda y por enseñar algo nuevo.
    domingo, 18 de septiembre de 2016 20:22