Comparer les éléments d'un listbox

Résolu
Taur33 Messages postés 85 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 20 mai 2011 - 23 avril 2011 à 19:49
Taur33 Messages postés 85 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 20 mai 2011 - 24 avril 2011 à 12:02
Bonsoir à tous,
je veux faire un programme qui s'execute en 3 étapes:

étape1: Remplir listbox1 avec les valeurs de 1 à 100000
que j'ai codé ainsi:
 For i = 1 To 100000
            ListBox1.Items.Add(i)
        Next

cela mets 10 secondes(ca me parait long).Y'a + rapide ?

étape 2: Pour chaque élément de listbox1 trouver combien de nombres premiers il existe avant l'élément(Exemple:pour 100 il y a 25 premiers < à 100) puis mettre cette valeur dans listbox2
que j'ai codé ainsi:
 Dim k As Integer

        For i = 0 To ListBox1.Items.Count - 1
' Prem est un arraylist contenant les nbres premiers jusqu'à 100000
            If Prem.IndexOf(ListBox1.Items(i)) = -1 Then
                k = k + 0
            Else
                k = k + 1
            End If
            Application.DoEvents()
            ListBox2.Items.Add(k)
        Next

temps:50 secondes

étape 3 :établir combien de fois k apparait dans listbox2(exemple:5 apparait 2 fois;6 apparait 4 fois)
et la c tres long avec ce que j'ai codé:
 Dim L As Integer = 0
        For m = 0 To ListBox2.Items.Count - 1
            For n = m To ListBox2.Items.Count - 1
                If ListBox2.Items(m) ListBox2.Items(n) Then L L + 1
            Next
            If m > 0 AndAlso ListBox2.Items(m) = ListBox2.Items(m - 1) Then
                L = 0 : Continue For
            Else
                ListBox3.Items.Add(L) : L = 0
            End If
        Next


10 secondes pour remplir 1 listbox,50 secondes pour savoir si chaque élément de listbox1 est premier;et la catastrophe 20 minutes pour dire combien de fois apparait un nombre dans un listbox
y'a t il quelque bienfaiteur pour m'aider à optimiser mes codes.
Merci d'avance

11 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
23 avril 2011 à 20:55
Bonjour,

On va reprendre point par point, mais déjà quelques remarques d'ordre général :
- A la place d'utiliser Add dans les cas d'ajouts massif, préférer AddRange
- Préférer utiliser List(Of T) à la place d'une ArrayList
- Eviter les DoEvents (.NET surtout), en règle général, c'est car on s'est trompé quelque part, et surtout, c'est très chronophage.
- Donnes des noms explicites à tes variables
- Eviter les instructions multiples su une ligne (séparés par des : )

1) Utilises AddRange à la place de Add (il te faut une collection d'éléments à ajouter évidemment)

2) Vires le DoEvents
Prépare le résultat dans une collection puis utilises un AddRange

3) Limite le nombre de boucles et les instructions inutiles (k=k+0)

Proposition :
Dim L As Integer = 0
Dim ltTab as List(Of Integer)=New List(Of Integer)
For m = 0 To ListBox2.Items.Count - 2
If ListBox2.Items(m) = ListBox2.Items(m - 1) Then
L+=1
Else
ltTab.Add(L)
L = 0
End If
Next
ltTab.Add(L)
ListBox3.AddRange(ltTab.ToArray)


Mon site
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
23 avril 2011 à 23:04
Bonjour,

Je pense que tu comprendras mieux, avec le code qui suit.
Dim ltTab as list(of Integer)=new list(of Integer)
For i = 1 To 100000
ltTab.Add (i)
Next
ListBox1.Items.AddRange(ltTab.ToArray)


Dim ltTab2 as list(of Integer)=new list(of Integer)
Dim lNb As Integer=0
For i As Integer = 0 To ltTab.Count - 1
If Prem.Contains(ltTab(i)) Then
lNb = lNb + 1
End If
ltTab2.Add(lNb)
Next
ListBox2.Items.AddRange(ltTab2.ToArray)


lNb=0
Dim ltTab3 as list(of Integer)=new list(of Integer)
For i as Integer = 1 To ltTab2.Count - 1
If ltTab2(i) = ltTab2(i - 1) Then
lNb+=1
Else
ltTab3.Add(i)
lNb=0
End If
Next
ListBox3.Items.AddRange(ltTab3)


Sache que DoEvents mets en pause le code le temps d'exécuter les autres fonctions. Donc ça te prend beaucoup de temps dans ton application.

l'ArrayList est un peu plus lente, car elle n'est pas typée donc ça force à caster (transtyper) en permanence les valeurs, ça prends un peu de temps.

Mon site
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
24 avril 2011 à 00:40
Salut Taur33
essaye avec
Dim ltTab as list(of string)=new list(of string)
For i = 1 To 100000
ltTab.Add(i.tostring)
Next
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
23 avril 2011 à 23:33
Salut Henry

listbox1.Items.AddRange(ltTab.ToArray)


n'est pas accepté à cause de
Dim ltTab As New List(Of Integer)

si on met Dim ltTab As New List(Of string)
pas de problème
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Taur33 Messages postés 85 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 20 mai 2011
23 avril 2011 à 22:21
A la place d'utiliser Add dans les cas d'ajouts massif, préférer AddRange

addrange d'accord mais dans mon cas je n'ai pas un range tout fait(1 à 100000 faut que je le calcule)
chronophage :je ne comprends pas ce que tu veux dire?
application.doevents permets juste de mettre des données à lire à l'utilisateur le temps que se finisse la procédure
pourquoi éviter les instructions multilples sur une meme ligne séparées par : ?
Préférer utiliser List(Of T) à la place d'une ArrayList

la par contre tu peux m'aider à optimiser mon code
j'avoue que tu en sais + que moi en optimisation de code je ne te demandes pas un code tout fait mais je veux savoir la ou je fais fausse route
avec ton code que tu propose addrange n'est pas une propriété de listbox3
cordialement
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
23 avril 2011 à 23:47
Bonjour,

Problème résolu ? (si oui, merci de mettre "réponse acceptée" sur le ou les messages qui t'ont aidés)

Bien que passer en String, ne me semble pas top, si ça fonctionne ...
Quel était le message d'erreur ?

Mon site
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
23 avril 2011 à 23:59
ce n'est pas une erreur après le compiling
dès qu'on écrit c'est souligné d'un trait ondulé
bleu
overload resolution failed because no accessible
"addrange" can be called with these arguments
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
24 avril 2011 à 00:03
Bonjour,

Si c'est une erreur, il te dit qu'il ne sait pas quelle surcharge de AddRange appeler.

Si ça fonctionne après ton ajustement, pk pas.

As-tu activé Option Strict ?

Mon site
0
Taur33 Messages postés 85 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 20 mai 2011
24 avril 2011 à 00:15
Avec ton code N henry j'ai un message:
Private Sub But ton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Temps As Long ' temps de calcul
Temps = My.Computer.Clock.TickCount ' temps de calcul
Me.Cursor = Cursors.WaitCursor

Dim ltTab as list(of Integer)=new list(of Integer)
For i = 1 To 100000
ltTab.Add(i)
Next
' ici l'erreur
ListBox1.Items.AddRange(ltTab.ToArray) 'ici La rtésolution de surcharge a échoué carv aucun addrange accessible ne peux etre appellé avec ses arguments


Dim ltTab2 As List(Of Integer) = New List(Of Integer)
Dim lNb As Integer = 0
For i As Integer = 0 To ltTab.Count - 1
If Prem.Contains(ltTab(i)) Then
lNb = lNb + 1
End If
ltTab2.Add(lNb)
Next
ListBox2.Items.AddRange(ltTab2.ToArray)


lNb = 0
Dim ltTab3 As List(Of Integer) = New List(Of Integer)
For i As Integer = 1 To ltTab2.Count - 1
If ltTab2(i) = ltTab2(i - 1) Then
lNb += 1
Else
ltTab3.Add(i)
lNb = 0
End If
Next
ListBox3.Items.AddRange(ltTab3)




Me.Cursor = Cursors.Default
' temps mis par l'opération
Me.Text = "Opération effectuée en : " & Temps_écoulé(Temps)
End Sub
0
Taur33 Messages postés 85 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 20 mai 2011
24 avril 2011 à 01:01
merci de vos réponses Shayw et Nhenry
mais je n'y arrive tjrs pas aussi je propose de diviser mon prblm
Voila étape 1:
je veux mettre dans 1 listbox (listbox1) les nbres de 1 à 100000 cela met 10 secondes je trouve q c trop long (10 secondes) y ' a t il + rapide ?
merci d'avance
0
Taur33 Messages postés 85 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 20 mai 2011
24 avril 2011 à 12:02
- A la place d'utiliser Add dans les cas d'ajouts massif, préférer AddRange
- Préférer utiliser List(Of T) à la place d'une ArrayList
- Eviter les DoEvents (.NET surtout), en règle général, c'est car on s'est trompé quelque part, et surtout, c'est très chronophage.
- Donnes des noms explicites à tes variables
- Eviter les instructions multiples su une ligne (séparés par des : )


Tu as raison sur tous ces points nHenry et je vais l'appliquer à la lettre.
Merci pour tes precieux conseils
Merci aussi Shayw
Je vous shouaites un excellent week-end
0
Rejoignez-nous