Mas problemas :( filtrar o eliminar registros iguales

Iniciado por luis456, 23 Marzo 2016, 11:45 AM

0 Miembros y 1 Visitante están viendo este tema.

Lekim

#10
Chacho, por correo privado ya te contesté. ¿Dónde ves tú que aquí se repitan?

Código (vbnet) [Seleccionar]
       Dim Elementos As IEnumerable(Of Integer) = {1, 3, 4, 5, 6}
       Dim EleX As Integer = 0
       Dim EleX2 As Integer = 0
       ListBox1.Items.Clear() 'Limpia el ListBox
       For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
           For I2 As Integer = EleX To Elementos.Count - 1
               For I3 As Integer = EleX To Elementos.Count - 1
                   If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
                       ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                   End If

               Next
           Next
       Next
       MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)



01, 03, 04
01, 03, 05
01, 03, 06
01, 04, 05
01, 04, 06
01, 05, 06
03, 04, 05
03, 04, 06
03, 05, 06
04, 05, 06




Cita de: Lekim en 24 Marzo 2016, 13:17 PM
Bueno, y está..el de 3

Lo que tengo una duda respecto a como quieres combinarlos, ya que hay muchas posibilidades. Te aconsejo, cuando preguntes aquí en el foro que especifiques bien las condiciones, más que nada para ahorrarte tener que volver a preguntar y trabajo y tiempo perdido para los demás.

POSIBILIDADES DE COMBINAR DE TRES EN TRES:
Combinarlos de modos que el segundo y el tercero de  puedan repetir
1,2,2
1,2,3
1,2,4

Igual  y que  tercero pueda ser MENOR que el segundo.
...
1, 3, 2
1, 3, 3
1, 3, 4

Que el segundo y que el tercero no puedan ser iguales
...
1, 3, 2
1, 3, 4

1, 3, 5


Que el segundo y el tercero no puedan ser iguales y el tercero no pueda ser menor que el segundo
1, 2 ,3
1, 2, 4
1, 3, 4
1, 3, 5
2, 3, 4


CÓDIGO:
OPCIÓN 1: Permite el tercero menor que el segundo y que tercero y segundo sena iguales

Código (vbnet) [Seleccionar]

   Dim Elementos As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
       Dim EleX As Integer = 0
       Dim EleX2 As Integer = 0
       ListBox1.Items.Clear() 'Limpia el ListBox
       For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
           For I2 As Integer = EleX To Elementos.Count - 1
               For I3 As Integer = EleX - 1 To Elementos.Count - 1
                   ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
               Next
           Next
       Next
       MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)


OPCIÓN 2: No permite segundo y tercero sean iguales pero si que el tercero sea menor que el segundo.

Código (vbnet) [Seleccionar]
       Dim Elementos As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
       Dim EleX As Integer = 0
       Dim EleX2 As Integer = 0
       ListBox1.Items.Clear() 'Limpia el ListBox
       For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
           For I2 As Integer = EleX To Elementos.Count - 1
               For I3 As Integer = EleX - 1 To Elementos.Count - 1
                   If Elementos(I2) <> Elementos(I3) Then
                       ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                   End If

               Next
           Next
       Next
       MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)




OPCIÓN 3: No permite que el segundo y el tercero sean iguales, ni tampoco que el tercero sea menor que el segundo.

Código (vbnet) [Seleccionar]
       Dim Elementos As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
       Dim EleX As Integer = 0
       Dim EleX2 As Integer = 0
       ListBox1.Items.Clear() 'Limpia el ListBox
       For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
           For I2 As Integer = EleX To Elementos.Count - 1
               For I3 As Integer = EleX To Elementos.Count - 1
                   If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
                       ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                   End If

               Next
           Next
       Next
       MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)



Creo que no hay errores  :silbar:

Si eso me lo cuentas

S2s




Se llaman Combinaciones SIN REPETICIÓN y en combinatoria se puede simbolizar así:

C m,n

y la fórmula para determinar el número de combinaciones:
                    m!
C m,n =  ___________
               n! · ( m-n)!


donde m! es el factorial del número total de elementos
y n un número de elementos de cada grupo

Consiste por ejemplo en realizar con un determinado grupo de elementos E={A,B,C,D,E} grupos de 3 en 3 y sin repetición. Si hay ABC, no vale BCA, ni tampoco AAA o ABB.

Si m=[A,B,C,D,E]  = 5 elementos
n= grupos de 3 en 3

                      5!
C 5,3 =  ___________ = 10 combinaciones
               3! · ( 5-3)!


ABC
ABD
ABE
ACE
.....



         
Código (vbnet) [Seleccionar]
Dim Elementos As IEnumerable(Of Integer) = {1, 2, 3, 4, 5}
       Dim EleX As Integer = 0
       Dim EleX2 As Integer = 0
       ListBox1.Items.Clear() 'Limpia el ListBox
       For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
           For I2 As Integer = EleX To Elementos.Count - 1
               For I3 As Integer = EleX To Elementos.Count - 1
                   If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
                       ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                   End If

               Next
           Next
       Next
       MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)



Como ves salen 10



En la primitiva te saldrían ni más ni menos que......

49!/(6!·(49 - 6)!)= 13.983.816

Ya que en la primitiva da igual 14, 5 ,25 que  5, 14 ,25. Las bolas salen en un orden pero luego se ordenan, y no pueden volver a salir repetidas porque todas están en el mismo bombo.

Como ya te dije son casi 14 millones de combinaciones... :xD


luis456

Jjejeje no se cuando aprendí hablar chino  ;D ;D ;D  我不明白的貓

A ver lekim estoy usando este código, los tuyos los tengo reservados a otros proyecto que se me ocurren por cierto me parecen estupendos ,pero estoy usando el código de Elektro este código me entrega los números a si. y

supongamos que voy a jugar a la lotería  :silbar: .como dices son no se cuantos millones de apuestas pero te equivocas en la primitiva ahora son mas millones ya ahora es 6+complementario eso te multiplica la ostia  :o

Para que necesito hacer apuestas donde los números se repiten ? estaríamos formando realmente apuestas iguales si ordenamos los números de cada linea  de menor a mayor.veremos que se repiten muchos registros por ende. es lo que quiero eliminar todos los que tienen asterisco ya que son combinaciones iguales pero en diferente orden

asi es como me entrega AHORA este codigo los resultados

20, 24, 34***
20, 24, 37
20, 34, 24***
20, 34, 37
20, 37, 24
20, 37, 34****
24, 20, 34
24, 20, 37
24, 34, 20
24, 34, 37
24, 37, 20
24, 37, 34
34, 20, 24
34, 20, 37
34, 24, 20***
34, 24, 37
34, 37, 20
34, 37, 24
37, 20, 24****
37, 20, 34
37, 24, 20
37, 24, 34
37, 34, 20
37, 34, 24


Simplemente quiero dejar números, registros o lineas únicas


Código (vbnet) [Seleccionar]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim intCol As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}

        Dim pairsCol As IEnumerable(Of String) =
            From value1 As Integer In intCol
            From value2 As Integer In intCol
            Select String.Join(Environment.NewLine, (
                               From value3 As Integer In intCol
                               Where (value1 <> value2) AndAlso
                                     (value1 <> value3) AndAlso
                                     (value2 <> value3)
                               Select String.Format("{0:00}, {1:00}, {2:00}",
                                                    value1, value2, value3)))


        For Each pairs As String In pairsCol


            For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
                ' MsgBox(pairs.Count)
                ' MsgBox(line1.Count)

                Me.ListBox1.Items.Add(line)

            Next line

        Next pairs



Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

Lekim

#12
Bueno esto es como la once que le han puesto lo de los números de serie, pero en lo básico es 100000 números, luego tienes + el número de serie y todas las jodidos 'TIMOJUEGOS' que se les ocurra.

Realmente no me queda lo claro lo que quieres,  :-\. Pero mientras escribías hice este código a ver si te sirve.

Crea los seis números de la Primitiva, sin repetir y en orden de numeración con la función GetCombPrimitiva . Además crea tantas combinaciones como quieras hacer y SIN REPETIR, establecido en NumCombinaciones

Si hay algún fallo pues que alguien lo digo o lo arregle jaja

GENERADOR DE COMBINACIONES DEL LA PRIMITIVA
Código (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       Dim ListaComb As New List(Of String)         '//Lista de combinaciones
       Dim NumCombinaciones As Integer = 5
       Dim NewComb As String
       ListaComb.Clear()
       For B1 As Integer = 1 To NumCombinaciones
           While ListaComb.Count < NumCombinaciones
               NewComb = GetCombPrimitiva()
               ListaComb.Add(NewComb)
               ListaComb = ListaComb.Distinct.ToList
                My.Application.DoEvents()
           End While
       Next B1

       ListBox1.Items.Clear()
       For Each Elem As String In ListaComb
           ListBox1.Items.Add(Elem)
       Next
   End Sub

   Public Function GetCombPrimitiva() As String
       Dim Bombo As New List(Of Integer)           '//Bombo para meter las bolas
       Dim Fila As New List(Of Integer)            '//Fila virtual para poner las bolas en orden
       Dim Combinación As String = Nothing
       Dim NumRandom As New Random
       '//Llena el bombo
       For Bolas As Integer = 1 To 49
           Bombo.Add(Bolas)
       Next

       '//Extrae las bolas
       For Index As Integer = 1 To 6
           '//Devuelve números del 0 a 48 (49 números, Bola(0): contiene 1, Bola(1): Bolcontiene 2 ...)
           Dim Bola As Integer = NumRandom.Next(0, Bombo.Count)
           '//Mete la bola en la "fila"
           Fila.Add(Bombo(Bola))
           '//Quita la bola obtenida del bombo
           Bombo.RemoveAt(Bola)
       Next
       Fila.Sort() 'Ordena la fila de bolas
       For Each Bola As Integer In Fila
           Combinación += String.Format("{0:00} ", Bola)
       Next
       Return Combinación
   End Function

End Class




Por cierto que si Elektro no te lo ha resuelto ya es que no se puede  :xD

Además que lo que pides ya lo he puesto yo, creo , pero tu te has empeñado en usar este código:

Código (vbnet) [Seleccionar]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim intCol As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}

       Dim pairsCol As IEnumerable(Of String) =
           From value1 As Integer In intCol
           From value2 As Integer In intCol
           Select String.Join(Environment.NewLine, (
                              From value3 As Integer In intCol
                              Where (value1 <> value2) AndAlso
                                    (value1 <> value3) AndAlso
                                    (value2 <> value3)
                              Select String.Format("{0:00}, {1:00}, {2:00}",
                                                   value1, value2, value3)))


       For Each pairs As String In pairsCol


           For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
               ' MsgBox(pairs.Count)
               ' MsgBox(line1.Count)

               Me.ListBox1.Items.Add(line)

           Next line

       Next pairs


y quieres quitar repeticiones... este código ya está hecho para crear las combinaciones así, tendrías que cambiar las condiciones o añadir más código para ir leyendo línea tras línea y comprando para ir eliminado, un rollo  :-X

Sinceramente, no se como hacerlo usando ese código  :¬¬. Yo ta te lo hice. Parece que hablo chino yo jaja. Hasta he dado clases de combinatoria que más quieres XD

luis456

Joder estas empeñado con lo imposible jejej

Sinceramente, no se como hacerlo usando ese código  :¬¬. Yo ta te lo hice. Parece que hablo chino yo jaja. Hasta he dado clases de combinatoria que más quieres XD

Si lo que nesecito no es modificar el codigo. es eliminar en el listbox los numeros o lineas repetidas ........como ufff se me seca la lengua jajajja no me interesa modificar el codigo

voy corriendo a probar este codigo de la primi  a ver si tengo mas suerte que aca JAJAJJA

gracias :) por tu paciencia

Luis 
Que tu sabiduria no sea motivo de Humillacion para los demas

Lekim

#14
Cita de: luis456 en 25 Marzo 2016, 18:26 PM

Si lo que nesecito no es modificar el codigo. es eliminar en el listbox los numeros o lineas repetidas ........como ufff se me seca la lengua jajajja no me interesa modificar el codigo

gracias :) por tu paciencia

Luis  

ahí está compi, para hacer eso cambias el código o usas el que ya te di uno usando For Next o añades más còdigo para quitar las repeticones lo cual es un royo. Por eso te digo que si yo ya he puesto un código que hace esto mismo porque te empeñas en usar este XD

luis456

Cita de: Lekim en 25 Marzo 2016, 18:29 PM
ahí está compi, para hacer eso cambias el código o usas el que ya te di uno usando For Next o añades más còdigo para quitar las repeticones lo cual es un royo. Por eso te digo que si yo ya he puesto un código que hace esto mismo porque te empeñas en usar este XD

Ya puse tu codigo de la primitiva a rular a ver si ganamos jejejje   ;-) ,bueno en serio ,olvidate del codigo, solo imagina que tenemos el listbox y hay que eliminar como comento tan dificil es ???

Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

Lekim

#16
Amos a ver

¿Y esto que es lo que hace?

Código (vbnet) [Seleccionar]
       Dim Elementos As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}
       Dim EleX As Integer = 0
       Dim EleX2 As Integer = 0
       ListBox1.Items.Clear() 'Limpia el ListBox
       For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
           For I2 As Integer = EleX To Elementos.Count - 1
               For I3 As Integer = EleX To Elementos.Count - 1
                   If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
                       ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                   End If

               Next
           Next
       Next
       MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)



20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 44
20, 34, 45
20, 44, 45
24, 34, 44
24, 34, 45
24, 44, 45
34, 44, 45

madre miaaaa!!!!!




El de la primitiva tenía un fallo, no salía el 49, ya lo he arreglado  :-[




El de la primitiva modificando un poco también hace LO MISMO

Código (vbnet) [Seleccionar]
Public Class Form1
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim ListaComb As New List(Of String)         '//Lista de combinaciones
       Dim NumCombinaciones As Integer = 10 '<---OJO EN ESTE CASO SOLO LO MAXÍMO SON 10
       Dim NewComb As String
       ListaComb.Clear()

       For B1 As Integer = 1 To NumCombinaciones
           While ListaComb.Count < NumCombinaciones
               NewComb = GetCombPrimitiva()
               ListaComb.Add(NewComb)
               ListaComb = ListaComb.Distinct.ToList
               My.Application.DoEvents()
           End While
       Next B1
       ListaComb.Sort()
       ListBox1.Items.Clear()
       For Each Elem As String In ListaComb
           ListBox1.Items.Add(Elem)
       Next

   End Sub
   Public Function GetCombPrimitiva() As String
       Dim MisBolas() As String = {20, 24, 34, 44, 45}
       Dim Bombo As New List(Of Integer)           '//Bombo para meter las bolas
       Dim Fila As New List(Of Integer)            '//Fila virtual para poner las bolas en orden
       Dim Combinación As String = Nothing
       Dim NumRandom As New Random
       '//Llena el bombo
       For Index As Integer = 0 To MisBolas.Count - 1
           Bombo.Add(MisBolas(Index))
       Next

       '//Extrae las bolas
       For Index As Integer = 1 To 3
           '//Devuelve números del 0 a 48 (49 números, Bola(0): contiene 1, Bola(1): Bolcontiene 2 ...)
           Dim Bola As Integer = NumRandom.Next(0, Bombo.Count)
           '//Mete la bola en la "fila"
           Fila.Add(Bombo(Bola))
           '//Quita la bola obtenida del bombo
           Bombo.RemoveAt(Bola)
       Next
       Fila.Sort() 'Ordena la fila de bolas
       For Each Bola As Integer In Fila
           Combinación += String.Format("{0:00} ", Bola)
       Next
       Return Combinación
   End Function


End Class


Pero OJO con el valor que pones a NumCombinaciones , pues lo máximo que debes poner es el máximo que permite las condiciones que en este caso son :

C5,3= 5!/(3!·(5-3)!) = 10 combinaciones

luis456

Cita de: Lekim en 25 Marzo 2016, 19:01 PM
Amos a ver

¿Y esto que es lo que hace?

Código (vbnet) [Seleccionar]
        Dim Elementos As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}
        Dim EleX As Integer = 0
        Dim EleX2 As Integer = 0
        ListBox1.Items.Clear() 'Limpia el ListBox
        For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
            For I2 As Integer = EleX To Elementos.Count - 1
                For I3 As Integer = EleX To Elementos.Count - 1
                    If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
                        ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                    End If

                Next
            Next
        Next
        MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)



20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 44
20, 34, 45
20, 44, 45
24, 34, 44
24, 34, 45
24, 44, 45
34, 44, 45

madre miaaaa!!!!!

A ver jejej en que parte empiezo hablar chino jajja no en serio ,se que te pica la curiosidad  :silbar: para ordenarlos lo puedo hacer a mano ademas tengo que mirar si este codigo hace exactamente que lo de elektro y por favor no te ofendas jejje no es que sea mejor o peor, es que tengo metida entre ceja y ceja una idea y yo soy muy "TERCO · lo Reconozco .solo quiero trabajar con el listbox despues que este cargado con el otro codigo, pero ahora mismo voy a compararlos ya te dire que hace jejejje solo mira bien y tienes que darte cuenta que es lo que hace y ya te lo dire pero con pruebas :)

Luis




Que tu sabiduria no sea motivo de Humillacion para los demas

Lekim

joer

El código de elektro te hace esto;

20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 24
20, 34, 44
20, 34, 45
20, 44, 24
20, 44, 34
20, 44, 45
20, 45, 24
20, 45, 34
20, 45, 44
24, 20, 34
24, 20, 44
24, 20, 45
24, 34, 20
24, 34, 44
24, 34, 45
24, 44, 20
24, 44, 34
24, 44, 45
24, 45, 20
24, 45, 34
24, 45, 44
34, 20, 24
34, 20, 44
34, 20, 45
34, 24, 20
34, 24, 44
34, 24, 45
34, 44, 20
34, 44, 24
34, 44, 45
34, 45, 20
34, 45, 24
34, 45, 44
44, 20, 24
44, 20, 34
44, 20, 45
44, 24, 20
44, 24, 34
44, 24, 45
44, 34, 20
44, 34, 24
44, 34, 45
44, 45, 20
44, 45, 24
44, 45, 34
45, 20, 24
45, 20, 34
45, 20, 44
45, 24, 20
45, 24, 34
45, 24, 44
45, 34, 20
45, 34, 24
45, 34, 44
45, 44, 20
45, 44, 24
45, 44, 34


y tu quieres quitar repeticiones de modo que si pone ABC , ni otro ABC, ni  ponga BCA o BAC, esto REPIIIIITOOOOOO son COMBINACIONES SIN REPETICION y al final te queda esto:

20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 44
20, 34, 45
20, 44, 45
24, 34, 44
24, 34, 45
24, 44, 45
34, 44, 45


Que es lo que hace mi código ¿Cual es el problema? Quien entienda que te compre ajajja.

luis456

 Hola cara de japones jejej es broma yo me tomo todo en broma ya con mi edad no se puede andar enfadado, mira como lo llevo ponlo a rular y dime que tal va :)

Código (vbnet) [Seleccionar]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Elementos As IEnumerable(Of Integer) = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 50}
        Dim EleX As Integer = 0
        Dim EleX2 As Integer = 0
        ListBox1.Items.Clear() 'Limpia el ListBox
        For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
            For I2 As Integer = EleX To Elementos.Count - 1
                For I3 As Integer = EleX To Elementos.Count - 1
                    If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
                        ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
                    End If

                Next
            Next
        Next
        MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim list As New List(Of String)
        Dim i As Integer

        For i = 0 To ListBox1.Items.Count - 1
            list.Add(ListBox1.Items(i))
        Next i

        ListBox1.Items.Clear()

        For Each s As String In list.Distinct
            ListBox1.Items.Add(s)
        Next
    End Sub



y si resta o no resta después de aplicar el filtro habra que poner un count despues de aplicar el filtro

espero
Luis


Que tu sabiduria no sea motivo de Humillacion para los demas