Eliminar duplicados en ListBox

  1. 2 weeks ago

    Hola, quiero eliminar entradas repetidas de un listbox con un pushbutton, no consigo hacerlo sin caer en un error. alguien me pue ayudar con el código.
    Gracias

  2. Javier M

    Jan 13 Xojo Inc, Pre-Release Testers, Xojo Pro, XDC Speakers, Third Party Store AprendeXojo - Europe, Spain

    Hola Carlos,

    Sería de ayuda que publicaras el código de lo que tienes ahora para ver lo que puede estar fallando. De lo contrario, es complicado... :-/

    Javier

  3. Ante todo disculpad por el título porque no refleja el contenido. Ya he conseguido que no me dé error, sin embargo, solo consigo borrar los valores repetidos por duplicado, si alguno está por triplicado solo me quita una ocurrencia. Y si vuelvo a ejecutar la acción del botón, ni se entera.

    Aquí va el código:

    dim rowcount as integer
    dim i as integer

    rowcount = window1.listbox1.LastRowIndex

    For i = rowcount - 1 downto 1

    If Abs(Val(window1.listbox1.CellValueAt(i,0)) - Val(window1.listbox1.CellValueAt(i+1,0))) <= 0.1 Then
    window1.listbox1.RemoveRowAt(i)
    End If

    Next

  4. Pues creo que al final faltaba una tontería el límite inferior de i tenía que ser 0 en lugar de 1.
    Y con eso parece funcionar bien. En todo caso si se os ocurre otra forma, bienvenida será.
    Gracias

  5. Mientras los valores similares estén seguidos funciona bien, cuando están separados, ya no sé com hacerlo.

  6. Javier M

    Jan 14 Xojo Inc, Pre-Release Testers, Xojo Pro, XDC Speakers, Third Party Store AprendeXojo - Europe, Spain
    Edited 2 weeks ago

    Hmmm… uno de mis métodos favoritos para hacer este tipo de "limpiezas" consiste en evitar que los duplicados lleguen al Listbox. Me explico: imagino que los datos que finalmente irán en el ListBox provienen de alguna fuente; pues bien, puedes crear un diccionario donde la clave sea el dato que necesites que sea único… antes de añadir dichos datos al ListBox.

    Si la clave del diccionario aun no existe: la añades al diccionario y asignas el valor (si no necesitas asignar un valor en concreto siempre puedes pasar un Nil o lo que más te convenga). Si la clave del diccionario ya existe (algo que puedes comprobar fácilmente) entonces te limitas a asignar el valor o bien seguir iterando con el próximo elemento.

    Una vez que el Diccionario ya tiene todos los datos sin duplicados (después de todo las claves del diccionario son únicas), pues iteras el diccionario y te limitas a añadir las claves al listado (junto con sus correspondientes valores en otra columna, si procede).

    De este modo da igual si los datos fuente contienen dos o más repeticiones: la clave del diccionario te hará de filtro y, por tanto, tu ListBox no tendrá duplicados y evitarás usar otros algoritmos que impliquen múltiples pasadas de comprobación.

    ¿El problema? Que esto te sirve así "tal cual" siempre y cuando no tengas que guardar diferentes valores para una misma clave… que también se puede hacer, claro!

    No sé si me he explicado bien… ¡si necesitas más detalle sólo tienes que decirme!

    (Por cierto, te he cambiado el título del hilo para que guarde más relación con el contenido del mismo; espero que no te parezca mal!)

  7. Gracias Javier voy a estudiar esta opción

  8. Los datos provienen de un array:
    dim data(-1) as double, ¿cómo hago para asociar sus valores a un diccionario? Perdona la pregunta, tal vez muy obvia, pero no estoy familiarizado con los diccionarios.

  9. Jeff T

    Jan 14 Pre-Release Testers Midlands of England, Europe

    something like this: (untested..)

    dim dict as new dictionary
    for x as integer = 0 to data.ubound
    if dict.haskey (data(x)) then
    //do nothing
    else
    dict.value(data(x)) = "Used"
    listbox1.addrow data(x)
    
    end if
    
    next
  10. nicolás c

    Jan 16 Pre-Release Testers, Xojo Pro

    hola carlos. te recomiendo utilizar la etiqueta "code" para publicar tus lineas de código en el foro. de esta forma es mucho más legible para los que deseamos ayudarte. el botón de código es el séptimo contando de izquierda a derecha

  11. Emile S

    Jan 16 Europe (France, Strasbourg)

    Y, si el tema es diferente, abra una nueva conversación.

or Sign Up to reply!