LISTBOX COMPARAR SEQUENCIA LINHA POR LINHA

PAYDANA 18/10/2012 02:28:04
#412230
Muito agradecido por lerem o tópico

[txt-color=#0000f0]Private Sub[/txt-color] Command1_Click()

[txt-color=#0000f0]For[/txt-color] x = 0 [txt-color=#0000f0]To[/txt-color] List1.ListCount - 1
a = List1.List(x)

[txt-color=#0000f0]For[/txt-color] y = 0 [txt-color=#0000f0]To[/txt-color] List1.ListCount + 1


b = List1.List(y)

[txt-color=#0000f0]If[/txt-color] a = b [txt-color=#0000f0]Then[/txt-color] MsgBox [Ô]=[Ô] & a & vbCrLf & b [txt-color=#0000f0]Else Exit For[/txt-color]

[txt-color=#0000f0]Next[/txt-color]
MsgBox [Ô]<>[Ô] & a & vbCrLf & b
[txt-color=#0000f0]Next[/txt-color]


[txt-color=#0000f0]End Sub

Private Sub Form_Load()[/txt-color]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]02[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]02[Ô]
List1.AddItem [Ô]03[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]09[Ô]
List1.AddItem [Ô]04[Ô]
List1.AddItem [Ô]02[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]07[Ô]
List1.AddItem [Ô]08[Ô]
List1.AddItem [Ô]02[Ô]
[txt-color=#0000f0]End Sub[/txt-color]

O que preciso e fazer uma comparação linha por linha
so que de duas ao mesmo tempo
enquanto um [txt-color=#0000f0]For[/txt-color] vai descendo lendo uma linha o outro vem atrás lendo a que ja foi lida
com isso eu comparo as duas, dae se forem iguais ele acusa a sequencia e continua lendo

nesse caso
[Ô]01[Ô]
[Ô]01[Ô]
[Ô]01[Ô]
ele acusaria a sequencia de 3 vezes

No exemplo que tentei fazer acima eu quase consegui mais chega um ponto que os dois [txt-color=#0000f0]For[/txt-color] se encontram rsrss

vlw ae galera. Obrigado!
LUIZCOMINO 18/10/2012 11:17:47
#412252
mas qual é a saída do programa?
ele acha as linhas iguais e ai ele faz oq?, remove do list?
MARCELO.TREZE 18/10/2012 11:49:55
#412255
Resposta escolhida
Eu vou explicar o principio, na realidade a lógica esta quase, você usará dois FOR, porém um será dentro do outro ou seja:

o for A lê a primeira linha, e dentro dele vai ter o for B que vai ler da segunda a ultima linha procurando valores iguais, e claro encontrando os valores iguais faz o que você deseja, vamos a um exemplo.

For A = 0 To List1.ListCount - 1
For B = 0 To List1.ListCount - 1
If B < > A Then
If List1.List(B) = List1.List(A) Then
[txt-color=#007100] [ô] faz o que você deseja[/txt-color]
End If
End If
Next B
Next A


RACEMAN 18/10/2012 13:48:34
#412271
O que o MARCELO-TREZE disse está certo, porém, isso é uma solução bem iniciante.
Imigine que seu banco de dados ou qualquer outro lugar tenha 1000(apenas mil) registros. Então sua rotina fará 1 milhão e mil vezes
Ou seja, for aninhado sempre será: (n² + n)
Acredito que você não esteja usando Banco de dados, caso contrário, com apenas um SELECT você faz isso...
O ideial é usar recursividade, usando o que chamamos de Merge Sort.
http://pt.wikipedia.org/wiki/Merge_sort
é um pouco complexo mas, vale a pena. No wiki tem exemplos....
PAYDANA 18/10/2012 14:09:10
#412273
For a = 0 To List1.ListCount - 1
For b = 0 To List1.ListCount - 1
If b <> a Then
If List1.List(b) = List1.List(a) Then
MsgBox [Ô]repetiu[Ô] & [Ô] [Ô] & a & [Ô] [Ô] & b
Else
MsgBox [Ô]pulou[Ô] & [Ô] [Ô] & a & [Ô] [Ô] & b
End If
End If
Next b
Next a

MARCELO-TREZE

Não ta exatamente como preciso mais agradeço muito pela ajuda


Acabei [Ô]conseguindo[Ô] aqui depois que me encinaram pra que servia o [txt-color=#0000f0]Step[/txt-color]

For x = 0 To List1.ListCount Step 2
a = List1.List(x)

For y = 1 To List1.ListCount
b = List1.List(y)

MsgBox a & [Ô]a[Ô] & vbCrLf & b & [Ô]b[Ô]
a = b
Next

[txt-color=#0000f0]Next x[/txt-color]



Agora me falta condicionar isto dae, ja que minha intençao e diminuir linhas tipo:

01
01
01
01

vira uma linha só -> repetiu 5 vezes

Obrigado a todos!
RACEMAN 18/10/2012 14:14:05
#412274
Existe uma maneira bem melhor ,que não precisa nada disso que nós falamos...

Você tem que saber quantos têm repetidos na lista certo?

Para você não fazer rotinas gigantes(que dependendo da lista faça [Ô]clocks[Ô] de 1 milhão de vezes), faça:

Crie um array com o tamanho da tabela ASCII se for para Caracteres
Se for apenas números crie um vetor de 0 a 10
Exemplo:
dim lista(256) as integer // para guardar tudo char
dim lista(10) as integer //para guardar os números(quantidades deles)
inicie eles com os valores = 0
faça apenas UM for do inicio ao fim da lista

Cada item da lista, vc converte o char para inteiro
e soma + 1 na lista....

No fim, você só mostra a lista que tiver maior que 0
Isso vai ser MUITO mais rápido e leve que as soluções acima.
Segue em anexo o exemplo
PAYDANA 18/10/2012 14:20:22
#412276
E maisomenos isso mesmo [txt-color=#0000f0]RACEMAN[/txt-color] so que a comparação e com 2 digitos mesmo como postei

List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]02[Ô]
List1.AddItem [Ô]03[Ô]
List1.AddItem [Ô]04[Ô]
List1.AddItem [Ô]04[Ô]
List1.AddItem [Ô]04[Ô]
List1.AddItem [Ô]05[Ô]
List1.AddItem [Ô]05[Ô]
List1.AddItem [Ô]05[Ô]
List1.AddItem [Ô]06[Ô]
List1.AddItem [Ô]07[Ô]
List1.AddItem [Ô]08[Ô]
List1.AddItem [Ô]09[Ô]
List1.AddItem [Ô]10[Ô]
List1.AddItem [Ô]11[Ô]
List1.AddItem [Ô]12[Ô]
List1.AddItem [Ô]13[Ô]
List1.AddItem [Ô]14[Ô]
List1.AddItem [Ô]15[Ô]

e não com 0 to 9

to tentando adapta seu codigo aqui
Obrigadão!
MARCELO.TREZE 18/10/2012 14:37:11
#412278
Nada na vida é fácil é indiscutível que os dois Laços com uma quantidade enorme de itens no listbox vai gerar uma demora, se formos falar do que é mais adequado eu indicaria que o colega informasse como preenche o list pois a partir dai ficaria até mais fácil, porém não sei se é manual ou através de uma consulta a um banco de dados.

porém verá no anexo como funciona:

cole isto no seu form e teste

Private Sub Command1_Click()
For A = 0 To List1.ListCount - 1
For b = 0 To List1.ListCount - 1
If b <> A Then
If List1.List(b) = List1.List(A) Then
List1.RemoveItem (b)
End If
End If
Next b
Next A
End Sub


Private Sub Form_Load()
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]01[Ô]
List1.AddItem [Ô]02[Ô]
List1.AddItem [Ô]03[Ô]
List1.AddItem [Ô]04[Ô]
List1.AddItem [Ô]04[Ô]
List1.AddItem [Ô]04[Ô]
List1.AddItem [Ô]05[Ô]
List1.AddItem [Ô]05[Ô]
List1.AddItem [Ô]05[Ô]
List1.AddItem [Ô]06[Ô]
List1.AddItem [Ô]07[Ô]
List1.AddItem [Ô]08[Ô]
List1.AddItem [Ô]09[Ô]
List1.AddItem [Ô]10[Ô]
List1.AddItem [Ô]11[Ô]
List1.AddItem [Ô]12[Ô]
List1.AddItem [Ô]13[Ô]
List1.AddItem [Ô]14[Ô]
List1.AddItem [Ô]15[Ô]
End Sub


PAYDANA 18/10/2012 14:53:58
#412280
Eu não posso remover MARCELO-TREZE

So preciso saber quantas vezes ele sequenciou

O exemplo do RACEMAN ta lindo, (Abriu um campo enorme pra eu viajar ) so não consegui ainda fazer ele trabalhar com 2 digitos
MARCELO.TREZE 18/10/2012 15:17:04
#412282
trabalhar com dois digitos é assim

For i = 0 To 100
List1.AddItem Format((Int(Rnd * 10)), [Ô]00[Ô])
Next i
RACEMAN 18/10/2012 16:14:26
#412287
MARCELO-TREZE, relendo o tópico,deu a impressão que eu disse que você era iniciante ou algo do tipo.
Mas é claro que eu não tive essa intenção. Pelo contrário, você é o que mais ajuda a galera!!!
Provavelmente um dos que mais tem conhecimento aqui...

Eu queria era atentar para o [Ô]problema[Ô] de usar for aninhado para certas ocasiões...
Pode parecer claro para a gente, mas, para muitos iniciantes não é...
Página 1 de 2 [15 registro(s)]
Tópico encerrado , respostas não são mais permitidas