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

Algorithmes et structures de données Discussion :

Combinaisons : comment remplacer des if par une boucle


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 53
    Points
    53
    Par défaut Combinaisons : comment remplacer des if par une boucle
    Bonjour à tous,
    Je butte actuellement sur le problème suivant (je travaille en JAVA).
    Je travaille sur une liste de messages. J'ai une interface d'exportation, qui exporte les messages selon 7 critères. Si mes souvenirs de stats sont loins, je crois quand même me rappeler que j'aurai à faire 7x6x5x4x3x2x1, soit 5040, tests sur les champs pour tout prévoir c'est ça ?
    D'où ma question : comment faire autrement ?
    Je ne vois pas trop comment faire une boucle qui me simplifie la vie ...
    Merci d'avance !

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,

    Citation Envoyé par maccormick Voir le message
    Si mes souvenirs de stats sont loins, je crois quand même me rappeler que j'aurai à faire 7x6x5x4x3x2x1, soit 5040, tests sur les champs pour tout prévoir c'est ça ?
    Je ne pense pas, non!
    Si chacun de tes critères i à Ci possibilités, ça fait le produit des Ci. Soit : C1*C2*....*C7 et pas 7! me semble-t-il.

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par maccormick Voir le message
    Je travaille sur une liste de messages. J'ai une interface d'exportation, qui exporte les messages selon 7 critères.
    C'est à dire ? Chaque message a des attributs (date, titre, ...) et tu as un filtre d'exportation du genre "Si date=xxx ET titre=YYY ET ... ALORS exporter" ?


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    C'est à dire ? Chaque message a des attributs (date, titre, ...) et tu as un filtre d'exportation du genre "Si date=xxx ET titre=YYY ET ... ALORS exporter" ?

    Oui, c'est tout à fait ça. Avec 3 critères de sélection date, titre, nombre de locuteurs, on a 7 possibilités :
    - si date = xxx
    - si date = xxx ET titre = xxx
    - si date = xxx ET nombre de locuteurs = xxx
    - si date = xxx ET titre = xxx ET nombre de lcuteurs = xxx
    - si titre = xxx
    - si titre = xxx ET nombre de locuteurs = xxx
    - si nombre de locuteurs = xxx

    d'ailleurs, si c'était une combinaison, on en aurait que 6 non ?
    bref, c'est pire !!
    le truc horrible, c'est qu'avant je faisais ça avec des simples AND en SQL puisque les données venaient d'une BDD, et je m'en sortais avec 2000 lignes, mais là je sèche complètement ...
    J'ai beau retourner le problème, je me retrouve au moins 6000 lignes de code, autant dire que s'il y a un changement à faire, c'est la galère ...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    Une façon de faire est de définir une classe de base 'Comparateur', avec une fonction virtuelle de type "bool Compare(Enregistrement e)"

    Puis des sous classes dans lesquelles tu surcharges la fonction virtuelle.

    Tu définis une sous classe par champ de ton enregistrement. Par exemple pour le champ 'Date', la sous classe 'ComparateurDate'.

    Le constructeur de 'ComparateurDate' prend en paramètre la valeur à comparer : ComparateurDate( Date valeur )

    Et dans la fonction surchargée de 'ComparateurDate' :
    bool Compare( Enregistrement e )
    {
    return e.Date == _valeur;
    }

    Au total ComparateurDate a cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class ComparateurDate : Comparateur
    {
        Date _valeur;
        ComparateurDate( Date valeur )
        {
            _valeur = valeur;
        }
        bool Compare( Enregistrement e )
        {
             return e.Date == _valeur;
        }
    }
    Selon les comparaisons choisies dans ton programme, tu fabriques alors les instances voulues pour les sous classes nécessaires et tu les mets dans une liste L.

    Ton enregistrement vérifie tous les critères s'il retourne 'vrai' dans la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for ( int i = 0 ; i < L.taille ; i++ )
    {
       if ( L[i].Compare( e ) == false )
          return false;
    }
    return true;

    (note : tout ça n'est pas du code java, car je ne connais pas java, mais à un ou deux mots clés près, ça doit le faire...)
    (note 2 : si tu as autre chose que des 'ET' dans tes comparaisons, c'est un peu plus compliqué... mais ça peut fonctionner sur un principe similaire)

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par maccormick Voir le message
    Oui, c'est tout à fait ça. Avec 3 critères de sélection date, titre, nombre de locuteurs, on a 7 possibilités :
    Pourquoi tu veux tester toutes les possibilités ? Tu as autant de critères que ca dans ton filtre d'exportation ?

    d'ailleurs, si c'était une combinaison, on en aurait que 6 non ?
    C'est une somme de combinaisons. Pour etre exact, c'est le nombre de sous-ensemble d'un ensemble à n éléments --> 2^n. Dans ton cas il faut retirer le sous-ensemble "vide" --> 2^n - 1

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Points : 53
    Points
    53
    Par défaut
    Même plus besoin de réfléchir à un algo, Google a pensé pour nous : la classe Predicate !
    Ca fait peur mais c'est tellement efficace ...
    Merci et @+

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

Discussions similaires

  1. Comment éviter des requêtes dans une boucle
    Par dam28800 dans le forum Langage
    Réponses: 43
    Dernier message: 04/12/2008, 16h53
  2. création des DDLs par une boucle for
    Par sophiesophie dans le forum C#
    Réponses: 27
    Dernier message: 29/05/2008, 11h29
  3. Réponses: 10
    Dernier message: 20/09/2006, 12h53
  4. Réponses: 4
    Dernier message: 29/08/2006, 17h44
  5. Réponses: 5
    Dernier message: 30/05/2005, 16h58

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