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 Java Discussion :

[Algo] idée de classement


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut [Algo] idée de classement
    Bonjour

    Cette fois, j'ai un petit problème de conception ou plutôt d'idée.
    Voici mon problème, supposons que je dispose d'une ArrayList d'objets. Ces objets contiennent un tableau dont je mesure la taille. Ce que je voudrais, c'est pouvoir classer ces objets dans une autre structure (c'est là que j'hésite) en fonction de cette taille du tableau (mettons du plus petit au plus grand). Mon problème vient aussi sur la prévision des cas où les tailles sont égales.

    Merci d'avance de vos suggestions et conseils.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut Re: [Algo] idée de classement
    Salut,


    Dans un premier temps il faut te créer un objet Comparator :
    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
    public class MyObjectComparator implements Comparator {
     
    	public int compare (Object o1, Object o2) {
    		MyObject object1 = (MyObject) o1;
    		MyObject object2 = (MyObject) o2;
     
     
    		if (object1.getSize() < object2.getSize()) {
    			return -1;
    		}
    		if (object1.getSize() > object2.getSize()) {
    			return 1;
    		}
    		return 0;
    	}
     
    }
    La méthode compare() doir renvoyer :
    • un nombre négatif si o1 < o2
      0 si o1 == o2
      un nombre positif si o1 > o2



    Ensuite il te suffit d'utiliser la méthode Collections.sort() pour trier ta liste avec ce comparator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Creation d'une copie de la liste :
    List copie = new ArrayList(list);
     
    // Trie de la copie :
    Collections.sort(copie, new MyObjectComparator());

    Citation Envoyé par GLDavid
    Mon problème vient aussi sur la prévision des cas où les tailles sont égales.
    Dans mon exemple ils resteront dans l'ordre d'apparition car compare() renvoit 0. Tu peux eventuellement éviter de renvoyer zéro en utilisant alors une autre propriété de tes objets pour les différencier...

    a++

  3. #3
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Tu peux utiliser un comparator qui te permettra d'ordonner tes objets.

    http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator)
    http://java.sun.com/j2se/1.4.2/docs/api/java/util/Comparator.html

  4. #4
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Où faire implémenter tes objets l'interface Comparable...

  5. #5
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Ok, j'essaierais tout ça
    Merci à vous

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Regis.C
    Où faire implémenter tes objets l'interface Comparable...
    En effet ! C'est d'ailleurs recommandé si cela correspond à "l'ordre naturel" des objets, et Comparator pour d'autre sorte de tri...

    Et j'ai oublié d'indiquer que je n'ai pas gérer les valeurs null ni les objets de type différents dans mon code (il faudrait sécurisé le code avec des instanceof).

    Eventuellement si tu utilises Java 5.0 tu peux utiliser les Generics pour sécuriser tout cela simplement

    a++

  7. #7
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Hmmm, je suis un peu paumé (après 1 an assidu de Perl !).
    Voici la classe que je veux comparer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class ProteinStart {
     
        public String nom;
        public int position;
        public int []arrivee;
        public int []stroke;
     
    }
    Comme je vous l'ai indiqué tout à l'heure, je veux pouvoir comparer la taille du tableau arrivee entre 2 objets ProteinStart, d'où ma difficultée de comprendre par rapport à ce que vous dites.

    @++

    GLDavid, qui a un peu de mal à se remettre au Java

    PS : je suis sous JDK 1.4.2.
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  8. #8
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Si j'écris ceci (comme semble l'indiquer Regis.C) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class ProteinStart implements Comparable {
     
        public String nom;
        public int position;
        public int []arrivee;
        public int []stroke;
     
    }
    Eclipse est pas content :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class must implement the inherited abstract method Comparable.compareTo(Object)
    J'ai raté un épisode ??

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  9. #9
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Voici vite fait (donc avec de probables erreurs à quoi pourrait ressembler ta classe:

    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
     
    class ProteinStart implements Comparable
    {
     
        public String nom;
        public int position;
        public int []arrivee;
        public int []stroke;
     
     
    public int compareTo (Object otherObject) 
    	{ 
    	   ProteinStart other = (ProteinStart) otherObject; 
    	   return arrivee.size().compareTo(other.arrivee.size());//on compare les tailles des tableaux
    	}
     
    }

  10. #10
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Citation Envoyé par GLDavid
    J'ai raté un épisode ??

    @++
    Non, mais Eclipse te dit qu'il faut que la classe qui implémente une interface doit implémenter les methodes de l'interface choisie.

    Ici la methode CompareTo() est la methode contenue dans l'interface Comparable.

    J'imagine que c'est un peu chanud à appréhender quand on a pas touché Java depuis quelque temps...mais on est là pour ça !

  11. #11
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    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
    public class ProteinStartComparator implements Comparator {
     
       public int compare (Object o1, Object o2) {
          ProteinStart object1 = (ProteinStart) o1;
          ProteinStart object2 = (ProteinStart) o2;
     
     
          if (object1.arrivee.length < object2.arrivee.length) {
             return -1;
          }
          if (object1.arrivee.length > object2.arrivee.length) {
             return 1;
          }
          return 0;
       }
    }
    ...
    Collections.sort(taListe, new ProteinStartComparator());
    Ca doit marcher normalement, j'ai repris le code d'adiGuba et modifié légèrement pour tenir compte de ton objet.

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    On va utiliser l'interface Comparable. En implémentant cette interface, tes objet ProteinStart peuvent être comparer simplement via la méthode compareTo() :

    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
    class ProteinStart implements Comparable {
     
        public String nom;
        public int position;
        public int []arrivee;
        public int []stroke;
     
    	public int compareTo(Object o) {
     
    		// compareTo() prend un Object en paramètre
    		// il faut donc vérifier qu'on compare bien
    		// les mêmes objets, sinon on considère qu'il sont différent
    		if (o instanceof ProteinStart) {
    			ProteinStart other = (ProteinStart) o;
     
    			// Si les tailles sont identiques on retourne 0
    			if ( this.arrivee.length == other.arrivee.length) {
    				return 0;
    			}
     
    			// Si l'objet courant est plus petit on retourne -1
    			if ( this.arrivee.length < other.arrivee.length) {
    				return -1;
    			}
    			// sinon l'objet courant est plus grand on retourne 1
    			return 1;
    		}
     
    		// Et si l'objet n'est pas du type ProteinStart
    		// (ou s'il est egal à null) on retourne une valeur par defaut :
    		// Ceci ne concerne que les cas où il y a plusieurs type d'objet
    		// différent dans l'ArrayList...
    		return -1;
    	}
     
    	public boolean equals(Object o) {
    		// Si c'est la même reference c'est forcement egal
    		if (this==o) {
    			return true;
    		}
    		if (o instanceof ProteinStart) {
    			ProteinStart other = (ProteinStart) o;
    			return (this.arrivee.length == other.arrivee.length);
    		}
    		return false;
    	}
     
    }
    Il est plus propre d'implémenter aussi la méthode equals() dont le retour est cohérent avec compareTo() de manière a ce que o1.compareTo(o2)==0 si o1.equals(o2)...

    Les instanceof permettent de gérer les cas où la méthode est utilisé avec un autre type d'objet (ce qui est fort possible si il y a plusieurs type d'objet dans ton ArrayList). Cela permet d'éviter des ClassCastException...


    Ensuite il te suffit de remplir ton ArrayList avec tes objets et d'utiliser la méthode sort() pour trier la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(tonArrayList);
    La méthode sort() utilisera le retour de la méthode compareTo() pour trier les éléments dans le bon ordre...

    J'espère que c'est clair...

    a++

    PS : Ce n'est pas très joli d'avoir tous les champs public dans un Objet... il vaut mieux les mettres en protected/private et utiliser les accesseurs/mutateurs...

  13. #13
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Ok, je commence à comprendre.
    Toutefois, j'ai encore quelques soucis d'implémentations.
    Voici ma classe de comparaison :
    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
     
    public class ProteinStartComparator {
        public int compare (Object o1, Object o2) {
            ProteinStart object1 = (ProteinStart) o1;
            ProteinStart object2 = (ProteinStart) o2;
     
     
            if (object1.arrivee.length < object2.arrivee.length) {
               return -1;
            }
            if (object1.arrivee.length > object2.arrivee.length) {
               return 1;
            }
            return 0;
         } 
    }
    Et voici comment je l'utilise dans ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void arrangeHierarchical(PNode[]nodes){
            int reference = 0;
            ArrayList depart = getStart(Makanko.proteinList);
            setDeparture(depart);
            setArrival(depart);
            List zeList = (List)depart;
            Collections.sort(zeList, new ProteinStartComparator());
        }
    Mon erreur est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    The method sort(List) in the type Collections is not applicable for the arguments (List, ProteinStartComparator)
    Aïe, aïe !!
    Merci encore de votre aide !
    A charge de revanche si vous passez au Perl !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  14. #14
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    La méthode sort attend une List et un Comparator...

    Or même si ton objet ProteinStartComparator implémente la méthode compare() il faut qu'elle implemente Comparator pour etre un sorte de Comparator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class ProteinStartComparator implements Comparator {
    a++

  15. #15
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Ok, ça roule.
    Merci adiGuba et bien sûr à tous pour votre aide et pour votre explication lumineuse sur l'utilisation de l'interface comparable.
    Bon, si vous vous mettez au Perl, appalez-moi !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  16. #16
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Pas de problème

    Mais je viens de m'apercevoir que la réponse était dans la FAQ : Comment trier une List (ArrayList, Vector, ...) ou un tableau?

    Penses-y la prochaine fois

    (ca me fait marrer de rappeller un modo à l'ordre... surtout que ca fait beaucoups plus longtemps que moi que tu es modo !)

  17. #17
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Arf !
    On peut être modo et avoir encore des réflexes de débutant !
    Bon, allez, je m'auto-flagelle pour te faire plaisir !


    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  18. #18
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Citation Envoyé par adiGuba
    Pas de problème

    Mais je viens de m'apercevoir que la réponse était dans la FAQ : Comment trier une List (ArrayList, Vector, ...) ou un tableau?

    Penses-y la prochaine fois

    (ca me fait marrer de rappeller un modo à l'ordre... surtout que ca fait beaucoups plus longtemps que moi que tu es modo !)

    Ha ces moderateurs qui ne font même pas de recherche sur la FAQ !!!!
    MDR!

    Content d'avoir pu t'aider.
    Perso je penche plus pour l'utilisation de l'interface Comparable à Comparator, mais l'essentiel est d'y arriver.

  19. #19
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Regis.C

    Ha ces moderateurs qui ne font même pas de recherche sur la FAQ !!!!
    MDR!
    Le pire c'est qu'avant de répondre à une question je fais toujours une recherche dans la FAQ... sauf ce coup ci et à la fin je me suis dit ca devrait être dans la FAQ ca... et ca y était !!!

    Citation Envoyé par Regis.C
    Perso je penche plus pour l'utilisation de l'interface Comparable à Comparator, mais l'essentiel est d'y arriver.
    S'il n'y a qu'un seul type de tri il vaut mieux utiliser Comparable en effet. --> Comparable est prévu pour effectuer les tris dans l'ordre naturel des objets (valeur unicode des charactères pour les String, ordre croissant pour les Number...), alors que la classe Comparator permet de gérer d'autre type de tri (exemple : Collator gère le tri des String selon l'ordre alphabétique propre à une Locale).

    a++

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

Discussions similaires

  1. idée sur algo d'un script
    Par nina2007 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 01/09/2010, 11h30
  2. Algo de calcul de meilleur classement possible (football)
    Par pontus21 dans le forum Intelligence artificielle
    Réponses: 13
    Dernier message: 27/03/2009, 15h10
  3. Des idées pour algo de pathfinding ?
    Par Mat.M dans le forum Intelligence artificielle
    Réponses: 3
    Dernier message: 21/10/2008, 22h14
  4. Recherche Idee/Suggestion sur Algo
    Par Danyel dans le forum VB.NET
    Réponses: 15
    Dernier message: 26/08/2008, 18h38
  5. [XSL/XML]idée pour un algo?
    Par valal dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/07/2007, 10h27

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