Compter donnée identique dans une variable tableau

Résolu
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018 - 3 juin 2015 à 15:01
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 6 juin 2015 à 06:27
Bonjour et merci du temps consacré
Voici mon problème ,je charge dans une variable tableau des données comme ceci
Col1 Col2 Col3
4 188 193
5 188 193
6 187 193
7 101 116
7 186 193
8 93 124
8 185 193
9 90 127
9 184 193
10 85 131
10 184 192
11 83 133
11 183 192
11 80 137
12 181 192
13 79 139
14 75 141
14 179 192
15 74 143
15 178 192
15 72 145
16 176 192
17 71 146
17 176 191
18 69 148
18 174 191
18 67 149
ECT ...............

J'aimerais récupérer dans une nouvelle colonne la répétition des données de la colonne 1 ; c'est-à-dire :
Si j'ai une fois la même donnée donc colonne 4 = 1
Si j'ai deux fois la même donnée donc colonne 4 = 2
Si j'ai trois fois la même donnée donc colonne 4 = 3
Ect..............

Merci de votre aide et du temps consacré

14 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 3/06/2015 à 17:20
Bonjour,
C'est bien, mais ===>>
- combien de colonnes contient ton tableau ?
- qu'as-tu au moins tenté (code) pour y parvenir ?

EDIT : l'exposé de ton problème manque par ailleurs de précision, dès lors que tu ne dis pas sur quelle ligne de ton tableau tu souhaites mettre en colonne 4 le nombre d'occurrences concerné !

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 3/06/2015 à 18:43
bonjour cs_roro69
c'est quoi une variable tableau ? je connais les tableaux de variables mais pas celle que tu dis

tu as posé ta question en VB net . Est-ce bien cela ?
Comment sont organisées tes données ? 3 tableaux différents de variables pour chaque colonne ou un tableau de structure à 3 éléments dont chaque élément représente une colonne ?

et comme dis ucfoutu qu'as-tu codé ?
on attend des précisions !

Est-ce ceci que tu veux comme résultat ?

Col1 Col2 Col3 Col 4
4 188 193 1
5 188 193 1
6 187 193 1
7 101 116 2
7 186 193 2
8 93 124 2
8 185 193 2
9 90 127 2
9 184 193 2
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
Modifié par cs_roro69 le 3/06/2015 à 18:50
Bonjour et merci de votre intèrêt ;
Je m'excuse pour la question un peu confuse

Donc pour le moment mon tableau contient 3 colonne et donc je vais le redimensionner à 4 colonne ;
et pour les lignes voici ce que je souhaite:

Col1 Col2 Col3 Col4
4 188 193 1------>Car première colonne qu'une répétition
5 188 193 1------>Car première colonne qu'une répétition
6 187 193 1------>Car première colonne qu'une répétition
7 101 116 2------>Car première colonne= 2 répétition
7 186 193 2------>Car première colonne= 2 répétition
8 93 124 2------>Car première colonne= 2 répétition
8 185 193 2------>Car première colonne= 2 répétition
9 90 127 3------>Car première colonne= 3 répétition
9 184 193 3------>Car première colonne= 3 répétition
9 85 131 3------>Car première colonne= 3 répétition
10 184 192 1------>Car première colonne qu'une répétition
11 83 133 3------>Car première colonne= 3 répétition
11 183 192 3------>Car première colonne= 3 répétition
11 80 137 3------>Car première colonne= 3 répétition
ect......jusqu'a la fin de mon tableau.
Donc pour le code ;
J'ai tenté une boucle sur toutes les données de la colonne 1
avec des conditions et là je n'y arrive pas d'ou ma demande ici


Merci de votre aide et pour le temps consacré
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 juin 2015 à 19:15
1)
J'ai tenté une boucle sur toutes les données de la colonne 1
avec des conditions et là je n'y arrive pas d'ou ma demande ici

Ben ===>>> Montre-la donc, cette boucle que tu as tentée (c'est le prix à payer si tu veux mon aide).
2) tu n'as pas répondu à cette question de VB95 :
tu as posé ta question en VB net . Est-ce bien cela ?
0

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

Posez votre question
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
Modifié par cs_roro69 le 3/06/2015 à 20:43
bonsoir et merci pour votre aide
oui c'est bien en vb net ;
voici un morceau de mon code
  For n = 1 To UBound(Tablo, 1) -1
        If Tablo(n, 1) < > Tablo(n - 1, 1) And Tablo(n, 1) < > Tablo(n + 1, 1) Then
            Tablo(n, 4) = 1
        End if
        
        If Tablo(n, 1) = Tablo(n - 1, 1) Or Tablo(n, 1) = Tablo(n + 1, 1) Then
           Tablo(n, 4) = 2
        End if
         



    Next

' et là après je bloque complètement car pour la valeur 3 dans mes conditions je dois faire référence à n+2 ;ou n-2 et la sortie de tableau
Merci de votre intérêt
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 3/06/2015 à 21:09
Salut
C'est ici que l'on voit que programmer c'est 80% d'analyse et 20 % de code

Col1 Col2 Col3 Col4
4 188 193 1------>Car première colonne qu'une répétition
5 188 193 1------>Car première colonne qu'une répétition
6 187 193 1------>Car première colonne qu'une répétition
7 101 116 2------>Car première colonne= 2 répétition
7 186 193 2------>Car première colonne= 2 répétition
8 93 124 2------>Car première colonne= 2 répétition
8 185 193 2------>Car première colonne= 2 répétition
9 90 127 3------>Car première colonne= 3 répétition
9 184 193 3------>Car première colonne= 3 répétition
9 85 131 3------>Car première colonne= 3 répétition
10 184 192 1------>Car première colonne qu'une répétition
11 83 133 3------>Car première colonne= 3 répétition
11 183 192 3------>Car première colonne= 3 répétition
11 80 137 3------>Car première colonne= 3 répétition

1) on remarque que les données de la colonne 1 sont classées dans l'ordre croissant : toujours le faire
2) on crée un tableau2 contenant une seule fois les valeurs de la colonne 1 : il contiendra les valeurs 4 5 6 7 8 9 10 etc .....
3) parrallèlement à ce tableau2 on créera un autre tableau3 de même taille contenant le nombre de fois que la valeur du tableau2 existe : ce tableau contiendrait dans ton exemple 1 1 1 2 2 3 1 ( c'est le nombre de fois qu'apparaissent les valeurs 4 5 6 7 8 9 et 10 de ta colonne 1 )

Ce qui donnne
tableau2 - tableau3
Valeur - Nbre de fois
4 - 1
5 - 1
6 - 1
7 - 2
8 - 2
9 - 3
10 - 1

4) une fois ceci fait je complète ma colonne 4 de tes données ainsi
-prendre la première valeur de la colonne 1 du tableau de tes données: c'est un 4
-prendre la même valeur dans le tableau2 : c'est la première
-prendre le nombre de fois en tableau 3 ligne 1 et la mettre en colonne 4 du tableau d'origine

-prendre la seconde valeur valeur de la colonne 1 : c'est un 5
-donc on avance d'un cran dans le tableau2 pour avoir la valeur 5
-prendre le nombre de fois en tableau 3 ligne 2 et la mettre en colonne 4 du tableau d'origine

Si la valeur en colonne 1 est identique à la valeur précédente ( les 2 valeurs 7 qui se suivent ) on avance pas d'un cran dans le tableau2 et on répète le même nombre de fois en colonne 4

A toi de coder ce principe
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 3/06/2015 à 22:11
Regarde ce que fais ceci (écrit pour VBH6 où le premier indice d'un tableau est 0 :!
 Dim toto(5, 1)
toto(0, 0) = "a"
toto(1, 0) = "b"
toto(2, 0) = "c"
toto(3, 0) = "b"
toto(4, 0) = "b"
titi = toto
For i = 0 To 5
If titi(i, 0) <> "" Then
toto(i, 1) = 1
For j = i + 1 To 5
If titi(j, 0) = titi(i, 0) Then
toto(i, 1) = toto(i, 1) + 1
titi(j, 0) = ""
End If
Next
End If
Next


' ce qui suit n'est que pour visualiser le résultat
For i = 0 To 5
If toto(i, 1) = "" Then Exit For
MsgBox toto(i, 0) & " ====>>> " & toto(i, 1)
Next


Là :
- mon exemple est avec un tableau à deux dimensions ===>>asse aux dimensions que tu veux.

- je ne mets les nombres résultats que sur la première occurence de chaque valeur.

- Inspire-toi de cela. Le reste est maintenant facile.

EDIT : le "reste", dont j'ai dit qu'il était facile, l'est on ne peut plus.
Il suffit d'ajouter une toute petite boucle de rien du tout (je viens de le faire ==>> une seule ligne de code dans cette boucle).
Je ne te la montrerai, cette petite boucle additionnelle, qu'après avoir au moins vu tes efforts pour y parvenir seul.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
3 juin 2015 à 22:18
Merci beaucoup à vous deux pour vos réponses
C'est très gentil de votre part je vais analyser tout çà
Merci
Ps:Dire qu'avec un tableur une seule ligne de code avec countif suffit à faire cela ;mais bon quand on aime ce compliquer la tache............
--
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
3 juin 2015 à 22:25
Bonsoir, regarde du coté de Linq
Voila des exemples (en c#, mais c'est pareil), je pense qu'avec un GroupBy ou un distinct d'abord, puis un Count ça le fait.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 3/06/2015 à 23:27
Bonsoir, Whismeril,

je ne suis personnellement pas certain qu'il gagnerait beaucoup de cette manière, puisqu'il veut ajouter ce nombre en 4ème colonne de chaque ligne. Je vois alors mal comment il échapperait à une boucle à cette seule fin. Sans compter qu'il lui faudrait travailler, semble-t-il (?), sur un array à constituer d'abord.

Voici, de toutes manières, comment le faire de manière non sophistiquée, y compris si la première colonne n'est pas triée (car si tel est le cas dans l'exemple montré, il ne précise pas que tel est bien TOUJOURS le cas).
Voilà, donc ===>> (en VB6 à mon avis très vraisemblablement idem en .Net) :
' n'est là que pour se constituer un tableau/exemple _________
Dim toto(11, 4) ' |
toto(0, 0) = 4: toto(0, 1) = 188: toto(0, 2) = 193 ' |
toto(1, 0) = 5: toto(1, 1) = 188: toto(1, 2) = 193 ' |
toto(2, 0) = 6: toto(2, 1) = 187: toto(2, 2) = 193 ' |
toto(3, 0) = 7: toto(3, 1) = 101: toto(3, 2) = 116 ' |
toto(4, 0) = 8: toto(4, 1) = 93: toto(4, 2) = 124 ' |
toto(5, 0) = 8: toto(5, 1) = 185: toto(5, 2) = 193 ' |
toto(6, 0) = 9: toto(6, 1) = 90: toto(6, 2) = 127 ' |
toto(7, 0) = 9: toto(7, 1) = 184: toto(7, 2) = 193 ' |
toto(8, 0) = 10: toto(8, 1) = 85: toto(8, 2) = 131 ' |
toto(9, 0) = 11: toto(9, 1) = 83: toto(9, 2) = 133 ' |
toto(10, 0) = 11: toto(10, 1) = 183: toto(10, 2) = 192 ' |
toto(11, 0) = 11: toto(11, 1) = 80: toto(11, 2) = 137 ' |
'--------------------------------------------------------------

titi = toto
For i = 0 To UBound(toto)
If titi(i, 0) <> "" Then
toto(i, 4) = 1
For j = i + 1 To UBound(toto)
If titi(j, 0) = titi(i, 0) Then
toto(i, 4) = toto(i, 4) + 1
titi(j, 0) = ""
End If
Next
End If
Next
For i = 0 To UBound(toto)
For j = i + 1 To UBound(toto)
If toto(j, 0) = toto(i, 0) Then toto(j, 4) = toto(i, 4)
Next
Next


' ============ce qui suit n'est là que pour te permettre de visualiser le résultat
For i = 0 To UBound(toto)
MsgBox toto(i, 0) & " ====>>> " & toto(i, 4)
Next


EDIT : si maintenant son tableau est typé en numérique et non en variant ===>>>
Changer les guillemets par -111 (par exemple) dans
If titi(i, 0) <> "" et dans titi(j, 0) = ""
Ou tout autre nombre "particulier" qui ferait la "différence" nécessaire. J'ai pris un nombre négatif, par exemple.



________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
3 juin 2015 à 23:51
Bonsoir, je n'ai pas dit que ça éviterait toutes les boucles.
Ce que je proposais initialement devait en réduire le nombre, et simplifier les calculs.

Ensuite après un test, il semble que Linq ne marche pas avec un tableau à 2 dimensions, il faut un tableau de tableaux ou mieux une collection (quelle qu'elle soit) de class.

Mais comme j'ai senti une pointe de défi, voici un code, testé fonctionnel, sans boucles (apparentes, car les requêtes en font dans leur code bas niveau), le tout dans un tableau non trié.

               Dim toto(12)() As Integer
        toto(0) = {4, 188, 193}
        toto(2) = {5, 188, 193}
        toto(4) = {6, 187, 193}
        toto(6) = {7, 101, 116}
        toto(8) = {7, 186, 193}
        toto(10) = {8, 93, 124}
        toto(12) = {8, 185, 193}
        toto(1) = {9, 90, 127}
        toto(3) = {9, 184, 193}
        toto(5) = {9, 85, 131}
        toto(7) = {10, 184, 192}
        toto(9) = {11, 83, 133}
        toto(11) = {11, 183, 192}

        Dim tutu()() As Integer = (
            From t In toto
            Let c = toto.Select(Function(tt) tt(0)).Count(Function(ttt) ttt = t(0))
            Select {t(0), t(1), t(2), c}).ToArray()
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024
Modifié par ucfoutu le 4/06/2015 à 00:12
Non. Pas un défi (si ce n'est envers moi-même), mais une très grande curiosité, Wismeril.
Mais alors : il lui faudrait changer tout et ne plus partir d'un tableau normal, mais d'un tableau de tableaux.
J'avais également pensé, pour ma part, à un tableau de structures, mais cela bouleverserait également tout, tant en amont qu'en aval dans son projet. J'ai donc laissé tomber cette idée.
J'ignore totalement la raison pour laquelle il souhaite avoir cette information répétée pour chacun des articles, plutôt que d'associer simplement une valeur avec un nombre d'occurrences (donc à part et une seule fois).
Il a peut-être ses raisons que la raison ne connait pas.
Amitiés
Bonne nuit
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656 > ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018
4 juin 2015 à 07:20
Bonjour,
Mais alors : il lui faudrait changer tout et ne plus partir d'un tableau normal, mais d'un tableau de tableaux.

Oui, ça ne sera donc surement pas la solution qu'il utilisera.

Quand au "défi", c'est vrai qu'on ne voit pas le ton humoristique dans ma phrase.
Ma première réponse avait été rapide, sans trop gratter le problème, je suis même passé à coté du fait que les tableau bidemmsionnels ne sont pas pris en charge (du moins pas directement, il y a peut être une astuce).
Mais quand, je t'ai lu, "pas une boucle", je me suis dit chiche!

Bonne journée, et bonne pêche par ce beau temps
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656 > ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018
4 juin 2015 à 08:04
Et ma fois, pour étancher ta curiosité, rien ne t'empêche de télécharger une version gratuit de VB.Net (VB express ou Visual Studio Community) et de t'y lancer ;-).
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
5 juin 2015 à 23:44
Bonsoir, il existe au moins deux moyens de faire du linq dans un tableau 2D (n D?)
Ici en C#, je n'ai pas testé
http://stackoverflow.com/questions/28144017/how-to-use-linq-with-a-2-dimensional-array
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 4/06/2015 à 00:03
Ou une version avec des boucles apparentes

une listbox nommée ListBox1 et le code
La colonne 1 doit être triée par ordre croissant
La listbox n'est là que pour vérification

Public Class Form1

Private colonne1(0 To 11) As Integer, colonne2(0 To 11) As Integer, colonne3(0 To 11) As Integer, colonne4(0 To 11) As Integer
Private index As Integer
Private chaine As String


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

colonne1(0) = 4 : colonne2(0) = 188 : colonne3(0) = 193 : colonne4(0) = 0
colonne1(1) = 5 : colonne2(1) = 188 : colonne3(1) = 193 : colonne4(1) = 0
colonne1(2) = 6 : colonne2(2) = 101 : colonne3(2) = 193 : colonne4(2) = 0
colonne1(3) = 7 : colonne2(3) = 93 : colonne3(3) = 116 : colonne4(3) = 0
colonne1(4) = 8 : colonne2(4) = 185 : colonne3(4) = 124 : colonne4(4) = 0
colonne1(5) = 8 : colonne2(5) = 90 : colonne3(5) = 193 : colonne4(5) = 0
colonne1(6) = 9 : colonne2(6) = 184 : colonne3(6) = 127 : colonne4(6) = 0
colonne1(7) = 9 : colonne2(7) = 85 : colonne3(7) = 193 : colonne4(7) = 0
colonne1(8) = 10 : colonne2(8) = 83 : colonne3(8) = 131 : colonne4(8) = 0
colonne1(9) = 11 : colonne2(9) = 183 : colonne3(9) = 133 : colonne4(9) = 0
colonne1(10) = 11 : colonne2(10) = 80 : colonne3(10) = 192 : colonne4(10) = 0
colonne1(11) = 11 : colonne2(11) = 188 : colonne3(11) = 137 : colonne4(11) = 0
colonne4(0) = colonne4(0) + 1
index = 0
For i = 1 To 11
If colonne1(i) = colonne1(i - 1) Then
colonne4(index) = colonne4(index) + 1
Else
index = i
colonne4(index) = colonne4(index) + 1
End If
Next
For i = 0 To 11
If colonne4(i) = 0 Then
colonne4(i) = colonne4(i - 1)
End If
Next
ListBox1.Items.Clear()
For i = 0 To 11
ListBox1.Items.Add(colonne1(i).ToString & " - " & colonne2(i).ToString & " - " & colonne3(i).ToString & " - " & colonne4(i).ToString)
Next

End Sub

End Class
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
Modifié par cs_roro69 le 4/06/2015 à 09:34
Bonjour
Et vraiment grand merci pour vos réponses diverse (çà permet vraiment d'apprendre beaucoup de chose.)

Mon projet et de réaliser une toute petite application pour automatiser la réalisation de patron de livre plié comme montré dans l'exemple sur ce site :
http://www.faitmain-faitcoeur.fr/en-papier/tuto-livre-plie-ecriture/

Donc jusqu'à maintenant :
1) Je charge une photo dans une pictureBox (Image brut sans le traçage de ligne)
2) Je récupère les hauteurs de bande de couleur (départ=>arrivée) de chaque colonne dans un tableau comme le tableau ci-dessus
3) Donc comme dans le tutorial il me faut savoir le nombre de bande de couleur pour chaque colonne (Vous avez donc résolu cette question)
4) Maintenant je vais pouvoir récupérer le tableau final avec cette information car si :
a) repetition=1 ----> j'extrait la ligne
b) repetition =2 --> j'extrait une ligne sur deux
c) repetition=3 ---> j'extrait une ligne sur trois
ect....................


Merci
Ps : si quelqu'un à une autre analyse ou des conseils sur la démarche de ce projet je suis prêt à apprendre .


--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 4/06/2015 à 10:20
Il est ici une règle fondamentale à respecter : une seule question, concernant une seule difficulté parfaitement isolée par discussion.
Si la difficulté concernée est résolue : on libère la discussion (un clic sur le tag RESOLU) au niveau du 1er message.
Si une autre difficulté est rencontrée ===>> on ouvre une autre discussion concernant cette seule difficulté.


EDIT : j'en profite pour débarrasser mon code à la fois du tableau "clone" titi et du chiffre "particulier" ===>>>
For i = 0 To UBound(toto)
For j = i To UBound(toto)
If toto(j, 0) = toto(i, 0) Then
If toto(j, 4) < 1 Then
toto(i, 4) = toto(i, 4) + 1
Else
toto(j, 4) = 1
End If
End If
Next
Next
For i = 0 To UBound(toto)
For j = i + 1 To UBound(toto)
If toto(j, 0) = toto(i, 0) Then toto(j, 4) = toto(i, 4)
Next
Next

Plus coiurt, plus léger et plus rapide encore.
Je ne sais pas où j'avais la tête hier, à vouloir passer par un tremplin (titi) alors que l'on peut adroitement se servir de la 4ème colonne directement

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
cs_roro69 Messages postés 70 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 29 septembre 2018
4 juin 2015 à 10:39
Merci Ucfoutu
Désolé de ne pas avoir respect la règle ; je comprend fort bien
en tout cas merci beaucoup pour vos aides et votre patience .
Je vais de suite tagger résolu
Merci

--
0
Rejoignez-nous