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
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
Le tableau est trié ?
La recherche doit se faire sur un ou plusieurs éléments de la structure ?
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
Remplacer le Tableau de Structure par une TStringList trié avec comme object un pointeur sur la structure ... peut aussi être envisagé ...
voici la déclaration de ma structure.
Tout ce qu'il y a de plus simple.
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;
Je souhaiterais pouvoir faire une recherche sur CP ainsi que sur Ville sans avoir à parcourir tout le tableau.
Non, il ne l'est pas !Le tableau est trié ?
Salut Le Troll. Peux-tu -être plus explicite ?Remplacer le Tableau de Structure par une TStringList trié avec comme object un pointeur sur la structure ... peut aussi être envisagé ...
Aurais-tu un exemple sous la main?
Merci d'avance
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;
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
pour l'utiliser, tu peux faire directement
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 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 ShowMessage(hash['75001']);
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;
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 ...
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
Code compilable de l'unité
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
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.
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;
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.
@+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager