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

Langage Delphi Discussion :

Recherche dans un tableau structuré


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut Recherche dans un tableau structuré
    Bonjour,

    existe-t'il un fonction delphi qui permettrait de faire une recherche de chaine de caractères dans un tableau de type structure sans pour autant devoir parcourir tout le tableau à l'aide d'une boucle ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le tableau est trié ?

    La recherche doit se faire sur un ou plusieurs éléments de la structure ?

  3. #3
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Points
    3 968
    Par défaut
    Salut

    Si le tableau n'est pas ordonné selon le champ contenant la chaîne, la recherche linéaire me semble inévitable. Donne des précisions (déclaration du tableau et de la structure...)

    Cdlt

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 708
    Points : 25 590
    Points
    25 590
    Par défaut
    Remplacer le Tableau de Structure par une TStringList trié avec comme object un pointeur sur la structure ... peut aussi être envisagé ...

  5. #5
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    voici la déclaration de ma structure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TMyArray = record
        CP : string;
        Ville : string;
     
    MyArray:Array of TMyArray;
    Tout ce qu'il y a de plus simple.
    Je souhaiterais pouvoir faire une recherche sur CP ainsi que sur Ville sans avoir à parcourir tout le tableau.

    Le tableau est trié ?
    Non, il ne l'est pas !

    Remplacer le Tableau de Structure par une TStringList trié avec comme object un pointeur sur la structure ... peut aussi être envisagé ...
    Salut Le Troll. Peux-tu -être plus explicite ?
    Aurais-tu un exemple sous la main?

    Merci d'avance

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Pour uen recherche par ville ca va etre plus chaud.
    Par contre une recherche par code postale peut eventuelement se faire de maniere indexee.

    Ne pas oublier que le code postal est avant tout un Chiffre, donc peut servir d'indice.
    A moins que le code postale ne soit pas unique dans la liste on peut peut etre creer un tableaux indexé de <PRemier CP> a <Dernier CP> et stocker dans chaques cellules dont l'id correspond au code postal l'id du tableau des record.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyArray[CP[13014]].Ville;

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 708
    Points : 25 590
    Points
    25 590
    Par défaut
    Je n'ai pas d'exemple, mais j'ai mis sur le forum, une THashStringList qui pourrait te servir

    Je suppose que tu charge ta liste depuis un fichier ? Bon, il aurait été plus pratique d'avoir une simple table Paradox avec deux indexes ... mais je suppose que tu as des limitations avec ton Delphi ?

    Donc lors du remplissage de la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       hash := THashStringList.Create();
       hash['75001'] := 'Paris 1er Arr';
       hash['77700'] := 'SERRIS';
       hash['06300'] := 'Nice';
    pour l'utiliser, tu peux faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage(hash['75001']);
    Pour le tri c'est optimisé pour le Code Postal, par contre pour faire une double indexation, pour trier sur la ville, faudrait y réflechir car en laissant la TStringList faire son tri, on risque de perdre les liens ... ou faudrait purement dupliqué l'information, tient comme ci

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    type
      TCPVille = class(TObject) 
      private
        CPs: TStringList;
        Villes: TStringList;
        function GetCP(const Ville: string): string;
        function GetVille(const CP: string): string;
      public
        constructor Create;
        destructor Destroy; override;
        procedure Add(const CP, Ville: string);
        property CP[const Ville: string]: string read GetCP;
        property Ville[const CP: string]: string read GetVille;  
      end;
     
     
    constructor TCPVille.Create;
    begin
      CPs := TStringList.Create();
      CPs.Sorted := True;
      CPs.Duplicates := dupIgnore;
      Villes := TStringList.Create();
      Villes.Sorted := True;
      Villes.Duplicates := dupIgnore;
    end;
     
    destructor TCPVille.Destroy;
    var
      I: Integer;
    begin
      for I := 0 to CPs.Count - 1 do
        DisposeStr(PString(CPs.Objects[I]));
      for I := 0 to Villes.Count - 1 do
        DisposeStr(PString(Villes.Objects[I]));
     
      CPs.Free();
      Villes.Free();
    end;   
     
    procedure TCPVille.Add(const CP, Ville: string);
    begin 
      CPs.AddObject(CP, NewStr(Ville)); // Vérifier ce que cela donne SANS NewStr, moi j'ai souvent eu des soucis la dessus, et d'autre non ...
      Villes.AddObject(Ville, NewStr(CP)); 
    end;
     
    function TCPVille.GetCP(const Ville: string): string;
    var
      I: Integer;
    begin
      I := Villes.IndexOf(Ville);
      if I >= 0 then
        Result := Villes[I]
      else
        Result := ''; 
    end;
     
    function TCPVille.GetVille(const CP: string): string;
    var
      I: Integer;
    begin
      I := CPs.IndexOf(Ville);
      if I >= 0 then
        Result := CPs[I]
      else
        Result := '';
    end;

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le problème c'est que s'il ne gère pas que la france au niveau des codes postaux, il va avoir des problèmes.
    Ex : L'angleterre qui a un code postal alphanumérique, Idem pour le luxembourg, etc ...

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 708
    Points : 25 590
    Points
    25 590
    Par défaut
    Je ne vois pas le problème puisque tout est géré en chaine, ensuite l'ordre dans la liste n'a aucun intéret, elle ne sert que pour la recherche optimisée

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 708
    Points : 25 590
    Points
    25 590
    Par défaut
    Code compilable de l'unité

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    unit uCPVilleList;
     
    interface
     
    uses SysUtils, Classes;
     
    type
      TCPVilleList = class(TObject) 
      private
        CPs: TStringList;
        Villes: TStringList;
        function GetCP(const Ville: string): string;
        function GetVille(const CP: string): string;
      public
        constructor Create;
        destructor Destroy; override;
        procedure Add(const CP, Ville: string);
        property CP[const Ville: string]: string read GetCP;
        property Ville[const CP: string]: string read GetVille;  
      end;
     
    implementation
     
    constructor TCPVilleList.Create;
    begin
      CPs := TStringList.Create();
      CPs.Sorted := True;
      CPs.Duplicates := dupIgnore;
      Villes := TStringList.Create();
      Villes.Sorted := True;
      Villes.Duplicates := dupIgnore;
    end;
     
    destructor TCPVilleList.Destroy;
    var
      I: Integer;
    begin
      if Assigned(CPs) then
      begin
        for I := 0 to CPs.Count - 1 do
          DisposeStr(PString(CPs.Objects[I]));
        CPs.Free();
      end;
     
      if Assigned(Villes) then
      begin
        for I := 0 to Villes.Count - 1 do
          DisposeStr(PString(Villes.Objects[I]));
        Villes.Free();
      end;
    end;
     
    procedure TCPVilleList.Add(const CP, Ville: string);
    begin 
      CPs.AddObject(CP, Pointer(NewStr(Ville))); // Vérifier ce que cela donne SANS NewStr, moi j'ai souvent eu des soucis la dessus, et d'autre non ...
      Villes.AddObject(Ville, Pointer(NewStr(CP)));
    end;
     
    function TCPVilleList.GetCP(const Ville: string): string;
    var
      I: Integer;
    begin
      I := Villes.IndexOf(Ville);
      if I >= 0 then
        Result := PString(Villes.Objects[I])^
      else
        Result := ''; 
    end;
     
    function TCPVilleList.GetVille(const CP: string): string;
    var
      I: Integer;
    begin
      I := CPs.IndexOf(CP);
      if I >= 0 then
        Result := PString(CPs.Objects[I])^
      else
        Result := '';
    end;
     
    end.
    et son utilisation

    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
    procedure TFrmTestDivers.BtnTestCPVilleListClick(Sender: TObject);
    var
      CPVille: TCPVilleList;
    begin
      CPVille := TCPVilleList.Create();
      try
        CPVille.Add('75001', 'Paris 1er Arr');
        CPVille.Add('77700', 'SERRIS');
        CPVille.Add('N6A 1H1', 'London');
        CPVille.Add('06300', 'Nice');
     
        ShowMessage(CPVille.Ville['77700']);
        ShowMessage(CPVille.CP['Nice']);
        ShowMessage(CPVille.Ville['N6A 1H1']);
      finally
        CPVille.Free();
      end;
    end;

  11. #11
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Salut à tous et merci pour vos réponses.

    T'es une bête le Troll. Super.

    Je devrais pouvoir faire plus que me débrouiller avec ça.

    @+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/04/2014, 13h06
  2. [WD17] Recherche dans un Tableau de Structures
    Par mazeille dans le forum WinDev
    Réponses: 3
    Dernier message: 10/09/2012, 14h10
  3. Réponses: 5
    Dernier message: 11/07/2008, 14h27
  4. [VBA-E] recherche dans un tableau
    Par tibss dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 03/05/2006, 18h52
  5. URGENt: recherche dans un tableau trié par ordre alphabetiqu
    Par JulPop dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/02/2005, 18h21

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