IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Tri multiple d'un TStringList


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut Tri multiple d'un TStringList
    Bonjour,
    Dans mon application, j'ai un TStringList alimenté à partir d'un fichier texte par un "LoadFromFile".
    Ce TStringList contient des chaines qui regroupent:
    Station, Latitude, Longitude, Altitude. Elles sont séparées par des virgules.

    Je souhaiterait faire un double tri sur les Latitudes par ordre croissant et sur les Longitudes dans le même ordre croissant.
    C'est à dire que si plusieurs stations ont une même latitude, elles soient triées par Longitude.

    Pourriez vous m'aidez à réaliser ceci?

    Merci de votre attention

    Cordialement
    Pierre

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 492
    Points
    15 492
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Pourriez-vous donner un échantillon du fichier ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    Bonjour Roland,

    Merci de la réponse.
    Voici le fichier utilisé.wx_station_list_orig.rar
    Merci de ce que vous pourrez faire.

    Amicalement
    Pierre

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 492
    Points
    15 492
    Billets dans le blog
    9
    Par défaut
    J'ai écrit un petit bout de code qui semble faire le travail demandé mais seulement lorsque je le compile avec Free Pascal. Quand je le compile avec Delphi, j'ai une erreur à l'exécution. Je ne sais pas pourquoi. Donc je passe la main.

    Je joins quand même le fichier trié (et aussi le code, afin qu'on puisse éventuellement le corriger).
    Fichiers attachés Fichiers attachés

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    Bonsoir Roland,

    Merci d'avoir eu la gentillesse de consacrer une partie de ton weekend à étudier ma requête.

    Je vais de ce pas étudier tout celà et reviendrai te tenir informé de la suite des opérations.

    Encore merci

    Bien cordialement
    Pierre

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,
    Citation Envoyé par Roland Chastain Voir le message
    Quand je le compile avec Delphi, j'ai une erreur à l'exécution. Je ne sais pas pourquoi. Donc je passe la main.
    Débordement de pile...

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 492
    Points
    15 492
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Débordement de pile...
    Merci d'avoir regardé. C'est bizarre qu'en compilant avec Free Pascal le programme s'exécute sans erreur.

  8. #8
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Merci d'avoir regardé. C'est bizarre qu'en compilant avec Free Pascal le programme s'exécute sans erreur.
    En fait, il faut "coller" au principe du tri des chaines, c.a.d. faire les test de comparaison sur les 3 cas possibles :
    1. n1 = n2 renvoie 0
    2. n1 > n2 renvoie 1
    3. n1< n2 renvoie -1

    Si on modifie la fonction Compare comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function Compare(List: TStringList; Index1, Index2: Integer): Integer;
    var
      n1, n2: Single;
    begin
      n1 := Latitude(List[Index1]);
      n2 := Latitude(List[Index2]);
      if n1 = n2 then
      begin
        n1 := Longitude(List[Index1]);
        n2 := Longitude(List[Index2]);
      end;
      if n1 = n2 then          // A partir d'ici...
        Result := 0
      else if n1 > n2 then
        Result := 1
      else
        Result := -1;
    end;
    Alors, ça ne plante plus dans Delphi, car on limite les ordres de permutation et donc un empilement excessif...
    AMHA, FreePascal n'est pas affecté car soit il utilise une méthode tri un peu différente de Delphi, soit il gère la pile différemment...

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 492
    Points
    15 492
    Billets dans le blog
    9
    Par défaut
    Bien vu, Philippe !

  10. #10
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 492
    Points
    15 492
    Billets dans le blog
    9
    Par défaut
    Voici une nouvelle version des fonctions Latitude() et Longitude().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    uses
      Classes, StrUtils, SysUtils;
     
    function Latitude(const s: string): Single;
    var
      i, j: integer;
    begin
      i := Pos(',', s);
      j := PosEx(',', s, i + 1);
      result := StrToFloat(Copy(s, i + 1, j - i - 1));
    end;
     
    function Longitude(const s: string): Single;
    var
      i, j, k: integer;
    begin
      i := Pos(',', s);
      j := PosEx(',', s, i + 1);
      k := PosEx(',', s, j + 1);
      result := StrToFloat(Copy(s, j + 1, k - j - 1));
    end;
     
    ...
     
    begin
      DecimalSeparator := '.';

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    Bonjour,
    Je vois que Philippe s'est joint à Roland pour m'aider.
    merci à lui aussi d'avoir pris le temps de réfléchir à mon soucis.

    Votre solution marche à merveille et me permet de continuer le développement de mon projet.

    Grands merci à vous deux

    Bien cordialement
    Pierre


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete sur tri multiple
    Par Guillaume C dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/11/2007, 11h59
  2. [Débutant][XSLT] Tri "multiple"
    Par hobotalker dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/09/2007, 16h32
  3. Réponses: 6
    Dernier message: 05/05/2007, 11h12
  4. Formulaire tri multiple
    Par sheeridan dans le forum IHM
    Réponses: 2
    Dernier message: 26/12/2006, 07h10
  5. Tri multiple (programmeur Perl pas doué inside)
    Par Arioch dans le forum Langage
    Réponses: 5
    Dernier message: 18/07/2006, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo