Accueil > > > COMPACTAGE D'UNE SÉRIE NUMÉRIQUE
COMPACTAGE D'UNE SÉRIE NUMÉRIQUE
Information sur la source
Description
Il s'agit de 2 petites fonctions très simples, permettant de "compacter" une suite d'entiers, ou plus exactement de l'écrire sous une forme plus dense. Exemple: 1,2,3,4,6,9,10,11 ==> 1:4,6,9:11 La fonction décompacte fait le travail inverse (1:3,5 -> 1,2,3,5) Rien de bien extraordinaire, mais à ajouter pourquoi pas à une librairie de fonctions de manipulation de texte.
Source
- Option Explicit
-
- '---------------------------------------------------------------------------------------
- ' Procedure : Compacte
- ' DateTime : 24/07/2006 20:29
- ' Author : Jean-Marc
- ' Purpose : Compacte une "collection" de valeurs déja triées en
- ' ordre croissant.
- ' Exemple : 1,2,3,4,6,9,10,11 ==> 1:4,6,9:11
- '
- '---------------------------------------------------------------------------------------
- '
- Public Function Compacte(ByVal cdata As Collection) As String
- Dim idx As Long ' parcours de la collection
- Dim vidx As Long ' valeur (possible) du premier element d'une suite
- Dim vc As Long ' valeur courante
- Dim vp As Long ' valeur precedente
- Dim suite As Boolean ' flag indiquant si l'état courant est dans une suite ou non
- Dim tmpResult As String ' construction du résultat final par concaténations successives
-
- If cdata.Count = 0 Then ' si il n'y a pas d'éléments, quitte et retourne une chaine vide
- Exit Function
- End If
- vidx = cdata.Item(1) ' initialisations, avec le premier élément
- vp = vidx
- For idx = 2 To cdata.Count ' parcours à partir du second
- vc = cdata.Item(idx) ' récupération de la valeur courante
- If (vp + 1) = vc Then ' si elle suit immédiatement la valeur précédente
- suite = True ' on est dans une suite
- Else
- If suite Then ' sinon, on regarde si on était dans une suite
- ' si oui, on concatene la suite, qui part de vidx jusqu'à vp
- tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
- Else ' si non, on concatene la valeur précédente
- tmpResult = tmpResult & "," & CStr(vp)
- End If
- vidx = vc ' on réinitialise le premier élément d'une suite potentielle
- suite = False ' et on reset le flag de suite
- End If
- vp = vc ' stockage de la valeur courante dans vp
- Next idx
- If suite Then ' traitement final, identique à celui qui est dans la boucle
- tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
- Else
- tmpResult = tmpResult & "," & CStr(vp)
- End If
- Compacte = Mid$(tmpResult, 2) ' élimination de la première virgule
- End Function
-
- '---------------------------------------------------------------------------------------
- ' Procedure : Decompacte
- ' DateTime : 25/07/2006 20:15
- ' Author : Jean-Marc
- ' Purpose : Decompacte une chaine produite par compacte
- ' Exemple : 1:4,6,9:11 ==> 1,2,3,4,6,9,10,11
- '
- '---------------------------------------------------------------------------------------
- '
- Public Function Decompacte(ByVal data As String) As String
- Dim t() As String ' split la chaine
- Dim i As Long ' parcours des éléments de la chaine
- Dim j As Long ' génération des suites
- Dim p As Long ' cherche les suites grace au signe :
- Dim tmpResult As String ' résultat intermédiaire, construite par concatenation
-
- If data = vbNullString Then ' si chaine vide, retourne vide
- Exit Function
- End If
-
- t = Split(data, ",") ' split avec les virgules
- For i = LBound(t()) To UBound(t()) ' parcours
- p = InStr(t(i), ":")
- If p <> 0 Then ' est ce une suite (a:b)
- ' si oui, parcours de 'a' à 'b'
- For j = Val(Mid$(t(i), 1, p - 1)) To Val(Mid$(t(i), p + 1))
- tmpResult = tmpResult & "," & CStr(j)
- Next j
- Else
- tmpResult = tmpResult & "," & CStr(t(i)) ' sinon ajoute juste l'élément
- End If
- Next i
- Decompacte = Mid$(tmpResult, 2) ' retourne le resultat, en éliminant la première virgule
-
- End Function
-
- '
- ' exemple de compactage
- '
- Private Sub Command1_Click()
- Dim cc As Collection
- Dim result As String
-
- Set cc = New Collection
- cc.Add (1): cc.Add (2): cc.Add (3): cc.Add (4): cc.Add (6): cc.Add (9): cc.Add (10): cc.Add (11)
- result = Compacte(cc)
- Debug.Print result;: If result = "1:4,6,9:11" Then Debug.Print " ==> OK" Else Debug.Print " ==> KO"
- End Sub
-
- '
- ' exemple décompactage
- '
- Private Sub Command2_Click()
- Dim s As String
- Dim r As String
-
- s = "2:5,6,7,9:13,15:17,19,20"
- r = Decompacte(s)
- Debug.Print s & " => " & r
- End Sub
Option Explicit
'---------------------------------------------------------------------------------------
' Procedure : Compacte
' DateTime : 24/07/2006 20:29
' Author : Jean-Marc
' Purpose : Compacte une "collection" de valeurs déja triées en
' ordre croissant.
' Exemple : 1,2,3,4,6,9,10,11 ==> 1:4,6,9:11
'
'---------------------------------------------------------------------------------------
'
Public Function Compacte(ByVal cdata As Collection) As String
Dim idx As Long ' parcours de la collection
Dim vidx As Long ' valeur (possible) du premier element d'une suite
Dim vc As Long ' valeur courante
Dim vp As Long ' valeur precedente
Dim suite As Boolean ' flag indiquant si l'état courant est dans une suite ou non
Dim tmpResult As String ' construction du résultat final par concaténations successives
If cdata.Count = 0 Then ' si il n'y a pas d'éléments, quitte et retourne une chaine vide
Exit Function
End If
vidx = cdata.Item(1) ' initialisations, avec le premier élément
vp = vidx
For idx = 2 To cdata.Count ' parcours à partir du second
vc = cdata.Item(idx) ' récupération de la valeur courante
If (vp + 1) = vc Then ' si elle suit immédiatement la valeur précédente
suite = True ' on est dans une suite
Else
If suite Then ' sinon, on regarde si on était dans une suite
' si oui, on concatene la suite, qui part de vidx jusqu'à vp
tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
Else ' si non, on concatene la valeur précédente
tmpResult = tmpResult & "," & CStr(vp)
End If
vidx = vc ' on réinitialise le premier élément d'une suite potentielle
suite = False ' et on reset le flag de suite
End If
vp = vc ' stockage de la valeur courante dans vp
Next idx
If suite Then ' traitement final, identique à celui qui est dans la boucle
tmpResult = tmpResult & "," & CStr(vidx) & ":" & CStr(vp)
Else
tmpResult = tmpResult & "," & CStr(vp)
End If
Compacte = Mid$(tmpResult, 2) ' élimination de la première virgule
End Function
'---------------------------------------------------------------------------------------
' Procedure : Decompacte
' DateTime : 25/07/2006 20:15
' Author : Jean-Marc
' Purpose : Decompacte une chaine produite par compacte
' Exemple : 1:4,6,9:11 ==> 1,2,3,4,6,9,10,11
'
'---------------------------------------------------------------------------------------
'
Public Function Decompacte(ByVal data As String) As String
Dim t() As String ' split la chaine
Dim i As Long ' parcours des éléments de la chaine
Dim j As Long ' génération des suites
Dim p As Long ' cherche les suites grace au signe :
Dim tmpResult As String ' résultat intermédiaire, construite par concatenation
If data = vbNullString Then ' si chaine vide, retourne vide
Exit Function
End If
t = Split(data, ",") ' split avec les virgules
For i = LBound(t()) To UBound(t()) ' parcours
p = InStr(t(i), ":")
If p <> 0 Then ' est ce une suite (a:b)
' si oui, parcours de 'a' à 'b'
For j = Val(Mid$(t(i), 1, p - 1)) To Val(Mid$(t(i), p + 1))
tmpResult = tmpResult & "," & CStr(j)
Next j
Else
tmpResult = tmpResult & "," & CStr(t(i)) ' sinon ajoute juste l'élément
End If
Next i
Decompacte = Mid$(tmpResult, 2) ' retourne le resultat, en éliminant la première virgule
End Function
'
' exemple de compactage
'
Private Sub Command1_Click()
Dim cc As Collection
Dim result As String
Set cc = New Collection
cc.Add (1): cc.Add (2): cc.Add (3): cc.Add (4): cc.Add (6): cc.Add (9): cc.Add (10): cc.Add (11)
result = Compacte(cc)
Debug.Print result;: If result = "1:4,6,9:11" Then Debug.Print " ==> OK" Else Debug.Print " ==> KO"
End Sub
'
' exemple décompactage
'
Private Sub Command2_Click()
Dim s As String
Dim r As String
s = "2:5,6,7,9:13,15:17,19,20"
r = Decompacte(s)
Debug.Print s & " => " & r
End Sub
Conclusion
Note: la fonction compactage prend une collection en argument d'entrée, on peut très simplement la modifier ou la décliner en différentes versions: avec un tableau, une chaine de caractère, etc.
Historique
- 26 juillet 2006 21:00:12 :
- Précision sur la fonction Compacte
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Drag d'un fichier depuis l'explorer vers une zone Texte d'une feuille : help ! [ par GEDDi ]
Question bete mais je ne sais pas comment faire :J'ai une feuille(Form1) avec une zone de Texte (Text1) et je veux 'Draguer'un fichier venant de l"exp
ecrire dand un txt [ par Nic ]
comment ecrire un texte dans un fichiers txt car je voudrais faire entrer un texte dans un textbox et en cliquant sur un bouton le faire inscrire dans
Texte & Images [ par MEYS David ]
Comment réaliser une page qui comprent du texte et des images similaire a worddans une feuille en vb6Comment convertir une image BMP en JPGComment enr
Texte & Images [ par MEYS David ]
Comment réaliser une page qui comprent du texte et des images similaire a worddans une feuille en vb6Comment convertir une image BMP en JPGComment enr
Insérer du texte dans un textbox [ par phil ]
Salut !J'ai un textbox,je suis a un endroit donne dans le contenu du textbox (exemple : en plein milieu).Je clique sur un bouton et je veux qu'a l'end
Enregistrement d'un fichier texte [ par JCLK ]
J'utilise cette commande pour enregistrer un fichier texte, mais il y a un problème : des guillemets s'affichent au début et à la fin du texte. Commen
Manipulation des données dans un texte !! [ par beber ]
debutant 100% voir plus !Recherche comment ouvrir un fichier contenant des variables X et Y d'une fonction. Puis d'arriver sous VB à les recuperer pou
Gestion de caractères d'un fichier texte avec VB [ par pedro ]
Hello tout le monde .Je recherche les sources d'un programme qui permet de lire un fichier texte .Les données lu dans ce fichier doivent pouvoir etre
Datagrid [ par Christophe ]
Lorsque je saisie un texte dans un TextBox avec un retour chariot (touche ENTREE), et qu'ensuite je le copie dans un datagrid.A la place du retour cha
|
Derniers Blogs
[TECHDAYS 2010] #04 - WORKSHOP : UPGRADE DE MOSS 2007 VERS SHAREPOINT 2010[TECHDAYS 2010] #04 - WORKSHOP : UPGRADE DE MOSS 2007 VERS SHAREPOINT 2010 par pierre
Alain Bastardie (Consultant SQLi) présente le workshop d'upgrade de MOSS 2007 vers SharePoint 2010. Philisophie de la migration Faire un état des lieux avant de démarrer Utiliser des outils sur MOSS 2007 Résoudre les problèmes potent...
Cliquez pour lire la suite de l'article par pierre TECHDAYS PARIS 2010 : LA GOUVERNANCE DANS SHAREPOINT ONLINETECHDAYS PARIS 2010 : LA GOUVERNANCE DANS SHAREPOINT ONLINE par ROMELARD Fabrice
Animé par: Emmanuel Bergerat et Damien Caro La session a démarré par un premier retour sur la situation de la la solution BPOS (Business Productivity OnLine Suite) et les possibilités commerciales associées ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : ADMINISTRATION SHAREPOINT 2010TECHDAYS PARIS 2010 : ADMINISTRATION SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Patrick Guimonet et Benoit Hamet Cette session traitera des différents points exigés durant les taches d'administration : Planification (architecture, hébergement, authentification, .) Opération e...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [TECHDAYS 2010] #03 - WEB CONTENT MANAGEMENT SOUS SHAREPOINT 2010[TECHDAYS 2010] #03 - WEB CONTENT MANAGEMENT SOUS SHAREPOINT 2010 par pierre
Stephane Cordonnier de MCNext nous présente les fonctionnalités Web Content Management (WCM) sous SharePoint 2010. Qu'est-ce que le WCM ECM, GED, RM, WCM c'est quoi Plateforme SharePoint Versions SharePoint 2010 SharePoint Fondation...
Cliquez pour lire la suite de l'article par pierre [DESIGN PATTERNS] PARTIE 2: DIP: DEPENDENCY INVERSION PRINCIPLE[DESIGN PATTERNS] PARTIE 2: DIP: DEPENDENCY INVERSION PRINCIPLE par tja
C'est le dernier principe des principes du Design Orienté Objet (The Principles of Object Oriented Design) fondés par Robert C. Martin plus connu sous le pseudonyme d'Uncle Bob.
l'image empruntée de LosTechies.
Je ne traite pas les principes dans...
Cliquez pour lire la suite de l'article par tja
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
Comparez les prix

HTC Magic
Entre 429€ et 429€
|