Plage de chiffre dans un tableau d'integer [Résolu]

Signaler
Messages postés
12
Date d'inscription
mardi 17 juin 2003
Statut
Membre
Dernière intervention
21 septembre 2011
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour tout le monde,

j'ai un peu honte de posté cette demande mais au bout d'une journée sans solution optimisée ça m'a gonflé.

Alors mon problème:
l'utilisateur sélectionne dans une list numérotée de 1 à 256 des plages de chiffres que je veux simplifié.
Exemple: la sélection me retourne un tableau d'integer {1,9,63,64,65,66,67,68,69,70,241,242,243,254} et je veux simplifier dans un textbox de la façon suivante: "1;9;63-70;241-243;254" ou le "-" symbolise une plage

si vous avez une solution, je suis preneur

merci

4 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
A peaufiner car, si le dernier paquet de valeurs est une suite, elle n'est pas incluse dans le résultat.

Version corrigée :
        Dim maListe() As Integer = {1, 9, 63, 64, 65, 66, 67, 68, 69, 70, 241, 242, 243, 253, 254, 333}
        Dim mStart As Integer = 0
        Dim mLast As Integer = 0
        Dim sResult As String = ""

        mStart = maListe(LBound(maListe))
        mLast = mStart
        sResult = mStart.ToString
        For r As Short = (LBound(maListe) + 1) To UBound(maListe)
            If maListe(r) = mLast + 1 Then
                ' La valeur suivante suit numéiquement la précédente
                ' Mémorise
                mLast = maListe(r)
            Else
                ' Pas de suite : on va écrire la chaine
                If mStart = mLast Then
                    ' Il n'y a pas eu de suite numérique
                    sResult += ";" & maListe(r).ToString
                Else
                    ' Il y a eu une suite numérique
                    sResult += "-" & mLast.ToString & ";" & maListe(r).ToString
                End If
                ' Mémorise
                mLast = maListe(r)
                mStart = mLast
            End If
        Next
        ' Cas des suites numériques en fin de liste
        If mStart <> mLast Then
            ' Il y a eu une suite numérique
            sResult += "-" & mLast.ToString
        End If

        Debug.Print(sResult)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Salut

Pas bien compliqué, suffit de se concentrer.
Dim maListe() As Integer = {1, 9, 63, 64, 65, 66, 67, 68, 69, 70, 241, 242, 243, 254}
Dim mStart As Integer = 0
Dim mLast As Integer = 0
Dim sResult As String = ""

mStart = maListe(LBound(maListe))
mLast = mStart
sResult = mStart.ToString
For r As Short = (LBound(maListe) + 1) To UBound(maListe)
    If maListe(r) = mLast + 1 Then
        ' La valeur suivante suit numéiquement la précédente
        ' Mémorise
        mLast = maListe(r)
    Else
        ' Pas de suite : on va écrire la chaine
        If mStart = mLast Then
            ' Il n'y a pas eu de suite numérique
            sResult += ";" & maListe(r).ToString
            ' Mémorise
            mLast = maListe(r)
            mStart = mLast
        Else
            ' Il y a eu une suite numérique
            sResult += "-" & mLast.ToString & ";" & maListe(r).ToString
            ' Mémorise
            mLast = maListe(r)
            mStart = mLast
        End If
    End If
Next

Debug.Print(sResult)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
12
Date d'inscription
mardi 17 juin 2003
Statut
Membre
Dernière intervention
21 septembre 2011

MERCI Jack

j’avais déjà honte en postant le message mais je suis encore honteux en voyant la solution

merci de la réactivité en tout cas
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
lol, de rien