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
[Il était une fois Delphi ....]
Le tableau est trié ?
La recherche doit se faire sur un ou plusieurs éléments de la structure ?
Modérateur Delphi
Le guide du bon forumeur :
- Les règles du forum tu liras
- La FAQ et les tutoriels tu consulteras
- La fonction Recherche tu utiliseras
- Google tu vénèreras
__________
Rayek World : Youtube Facebook
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
M E N S . A G I T A T . M O L E M
Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal
"La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."
Remplacer le Tableau de Structure par une TStringList trié avec comme object un pointeur sur la structure ... peut aussi être envisagé ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
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
[Il était une fois Delphi ....]
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;
On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
--
Pourquoi tant de haine pour cette pauvre aide Delphi ????
Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
--
Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas
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;
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
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 ...
Modérateur Delphi
Le guide du bon forumeur :
- Les règles du forum tu liras
- La FAQ et les tutoriels tu consulteras
- La fonction Recherche tu utiliseras
- Google tu vénèreras
__________
Rayek World : Youtube Facebook
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
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
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;
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
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.
@+
[Il était une fois Delphi ....]
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