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 :

Insertion dans un TObjectList


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut Insertion dans un TObjectList
    Bonjour à tous,

    Mon but est d'inverser deux Combobox stockées dans un TObjectList en fonction de la valeur de leurs tags:
    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
    MaCombo : TComboBox;
    procedure TForm4.TrierCombo;
    var i,j,k:integer;
    begin
    for i:=0 to TObjectList .Count-2 do
       for j:=i+1 to TObjectList .Count-1 do
       begin
         if (TCombobox(TObjectList .items[i]).Tag > TCombobox(TObjectList.items[j]).Tag) then
         begin
             MaCombo := TCombobox(ComboCatenaire.items[j]);
             ComboCatenaire.delete(j);
                  ShowMessage(IntToStr(MaCombo.Tag));
             ComboCatenaire.insert(i,MaCombo as TComboBox);
                  ShowMessage(IntToStr(MaCombo.Tag));
        end;
       end;
    end
    Le problème c'est qu'apparemment toutes les propriétées relatives à ma combobox ont disparues (par exemple le tag passe de 0 avant l'insert, à 19773984 après). Je suppose que cela vient du fait que insert accepte en paramètre un TObject, mais alors comment lui passer une TCombobox?

    Merci bocoup,

    @+.

  2. #2
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Ma question est peut-être imbécile mais ....

    ... si ton objectif est de trier la liste, pourquoi n'utilises-tu pas Sort() ?

  3. #3
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    ... aussi ...

    Si tu cherches à déplacer les éléments à l'intérieur d'une même liste, peut-être est-ce que Move() ou Exchange() seraient plus judicieux.

    F1 est notre ami .

  4. #4
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Tout d'abord merci pour ta réponse...J'ai déjà fait le tri par sort (j'avais même déjà fais une discussion il n'y a pas longtemps dessus).
    Mais sort utilise QuickSort(qui n'est pas un tri stable), donc mes éléments avec des tags identiques étaient inversés alors que je ne le souhaite pas. .

    C'est pour cela que, après conseils, je me suis tourné vers un tri "manuel".

    @+.

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    pour des element identique rien ne t'empeche de faire un autre test afin de definir la position de l'elements
    le quicksort est un trie et la stabilité n'as pas de rapport avec le moindre trie

    bon ceci est un autre probleme
    comment a tu integrer tes element dans la liste d'objet ???

    @+ Phil

  6. #6
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Citation Envoyé par slimjoe
    F1 est notre ami
    Effectivement, j'ai pas été malin sur le coup puisque je me suis arrêter uniquement sur les premières méthodes de TobjectList...Ca c'est post qui meritera un délestage.
    En tout cas avec Exchange ça marche nickel, mais je trouve quand même le comportement de insert curieux.

    Citation Envoyé par anapurna
    pour des element identique rien ne t'empeche de faire un autre test afin de definir la position de l'elements
    le quicksort est un trie et la stabilité n'as pas de rapport avec le moindre trie
    Je sais pas, mais apparemment QuickSort utilise une méthode de pivot (elle choisit un élément dans la liste et place tous les autres en fonction de ce pivot). Et d'après les développeurs du forums Algo, elle aurait comme particularité d'être très rapide mais également instable...J'ai essayer plusieurs tests avec ma fonction compare, et j'ai jamais réussis à obtenir ce que je souhaitais.

    Merci pour tout.

    @+.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut
    Quand ils disent qu'elle est instable, ils ne parlent surement pas du comportement mais de la complexité de l'algorithme. En effet de part sa conception, cet algorithme aura une complexité variable en fonction des données présentes dans la liste à trier. Donc au final tu peux avoir un différence de temps de tri en fonction de l'ordre des choses a trier. MAIS même dans le pire des cas, le quicksort reste un algorithme parmis les plus efficace pour le tri.

    Si ca te parle : Dans le cas moyen la complexité de l'algorithme est en =(n log(n)) mais dans le pire des cas elle peut finir en O(n^2).

  8. #8
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Son problème est que QuickSort ne respecte pas l'ordre de départ pour des éléments de valeur identique.

    Après son tri n'est pas le plus performant pour faire ce qu'il veut, mais sur un petit nombre d'éléments, ça ne gêne pas trop.

  9. #9
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Le tri rapide n'est pas un tri stable car il ne préserve pas nécessairement l'ordre des éléments possédant une clef de tri identique.
    C'est pas moi qui le dis .

    Citation Envoyé par anapurna
    effectivement le quicksort utilise un pivot
    c'est un peu comme si tu fait une recherche par dichothomie
    tu ne lit pas toutes les page du dico
    tu ouvre une page ensuite selon la lettre ou tu te trouve tu recherche dans la partie droite de ton dico ou dans la partie gauche c'est exactement le meme principe quand a ton trie qui est beaucoup mais beaucoup plus lent c'est un trie a bulles ou Buble sort
    Je viens de me plonger dans les différentes sortent de tris, et effectivement le miens est très lent, mais je vois pas comment faire autrement, et à priori je n'aurais jamais plus de 100 éléments à trier, donc ça devrait passer?

    @+.

  10. #10
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Citation Envoyé par hy00ga
    Quand ils disent qu'elle est instable, ils ne parlent surement pas du comportement mais de la complexité de l'algorithme.
    Je ne suis pas sur que ce soit juste, c'est peut être justement le comportement. mais il faudrait vérifier
    La partie instable de ce tri, c'est qu'en cas de doublon (ou plus) sur certains élements, le tri peut donner des résultats différents selon l'ordre de départ.
    Je crois que le terme 'instable' est pour ceci.

    Exemple de tri selon le 1er nombre des couples.
    liste non triée: (2,a), (3,b), (2,b)
    la liste triée peut être
    soit: (2,a), (2,b), (3,b)
    soit: (2,b), (2,a), (3,b).

    -> 2 listes finales, triées selon 1 critère, ... mais différentes.

    A ce moment là, tu peux définir ta propre méthode de comparaison, faisant intervenir les données supplémentaires si c'est possible.

    je dis ca, mais désolé si je suis à coté de la plaque

    [EDIT]: tu l'as découvert avant mon post visiblement
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    effectivement le quicksort utilise un pivot
    c'est un peu comme si tu fait une recherche par dichothomie
    tu ne lit pas toutes les pages du dico
    tu ouvre une page ensuite selon la lettre ou tu te trouve tu recherche dans la partie droite de ton dico ou dans la partie gauche c'est exactement le meme principe quand a ton trie qui est beaucoup mais beaucoup plus lent c'est un trie a bulles ou Buble sort

    @+ Phil

  12. #12
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par PadawanDuDelphi
    Mais sort utilise QuickSort(qui n'est pas un tri stable), donc mes éléments avec des tags identiques étaient inversés alors que je ne le souhaite pas
    Salut!

    Encore une fois, je dis peut-être n'importe quoi mais bon...

    Quand on utilise Sort(), on doit passer une procédure en paramètre (TListSortCompare) qui indiquera à l'algo de tri si on doit permuter les éléments ou non (ça, tu sais ). As-tu essayé, dans la procédure, de vérifier si les Tag sont identiques et, si c'est le cas, de tester avec leur indices dans la liste ? Si les éléments sont identiques, on les "trie" selon leur position d'origine (donc ils devraient rester en place).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Compare(Item1, Item2: Pointer): Integer;
    begin
      Result := CompareValue((Item1 as TComboBox).Tag, (Item2 as TComboBox).Tag);
     
      if Result = EqualsValue then  //Les Tag sont identiques
        Result := CompareValue(MaListe.IndexOf(Item1), MaListe.IndexOf(Item2));
    end;
    J'ai pas testé et je ne suis pas certain que ça fonctionne.
    Je ne fais que lancer l'idée...


  13. #13
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Merci slimjoe,

    Après test, je peux t'affirmer que ta fonction fonctionne nickel...

    @+.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/06/2004, 12h47
  2. Insertion dans fichier texte + rapide que TStringList ?
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 26/02/2004, 11h34
  3. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  4. Insertion dans un fichier xml à partir d'un xsl
    Par alexandre54 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/03/2003, 09h45
  5. Insertion dans un fichier XML
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 4
    Dernier message: 27/02/2003, 17h16

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