Comparer les éléments d'un listbox [Résolu]

Taur33 85 Messages postés vendredi 24 septembre 2010Date d'inscription 20 mai 2011 Dernière intervention - 23 avril 2011 à 19:49 - Dernière réponse : Taur33 85 Messages postés vendredi 24 septembre 2010Date d'inscription 20 mai 2011 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
NHenry 14206 Messages postés vendredi 14 mars 2003Date d'inscription 21 juin 2018 Dernière intervention - 23 avril 2011 à 20:55
3
Merci
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

Merci NHenry 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 119 internautes ce mois-ci

Commenter la réponse de NHenry
Meilleure réponse
NHenry 14206 Messages postés vendredi 14 mars 2003Date d'inscription 21 juin 2018 Dernière intervention - 23 avril 2011 à 23:04
3
Merci
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

Merci NHenry 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 119 internautes ce mois-ci

Commenter la réponse de NHenry
Meilleure réponse
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 24 avril 2011 à 00:40
3
Merci
Salut Taur33
essaye avec
Dim ltTab as list(of string)=new list(of string)
For i = 1 To 100000
ltTab.Add(i.tostring)
Next

Merci cs_ShayW 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 119 internautes ce mois-ci

Commenter la réponse de cs_ShayW
Taur33 85 Messages postés vendredi 24 septembre 2010Date d'inscription 20 mai 2011 Dernière intervention - 23 avril 2011 à 22:21
0
Merci
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
Commenter la réponse de Taur33
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 23 avril 2011 à 23:33
0
Merci
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
Commenter la réponse de cs_ShayW
NHenry 14206 Messages postés vendredi 14 mars 2003Date d'inscription 21 juin 2018 Dernière intervention - 23 avril 2011 à 23:47
0
Merci
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
Commenter la réponse de NHenry
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 23 avril 2011 à 23:59
0
Merci
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
Commenter la réponse de cs_ShayW
NHenry 14206 Messages postés vendredi 14 mars 2003Date d'inscription 21 juin 2018 Dernière intervention - 24 avril 2011 à 00:03
0
Merci
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
Commenter la réponse de NHenry
Taur33 85 Messages postés vendredi 24 septembre 2010Date d'inscription 20 mai 2011 Dernière intervention - 24 avril 2011 à 00:15
0
Merci
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
Commenter la réponse de Taur33
Taur33 85 Messages postés vendredi 24 septembre 2010Date d'inscription 20 mai 2011 Dernière intervention - 24 avril 2011 à 01:01
0
Merci
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
Commenter la réponse de Taur33
Taur33 85 Messages postés vendredi 24 septembre 2010Date d'inscription 20 mai 2011 Dernière intervention - 24 avril 2011 à 12:02
0
Merci
- 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
Commenter la réponse de Taur33

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.