[Java]Modification de code[Résolu]

Modification de code[Résolu] [Java] - Java - Programmation

Marsh Posté le 23-04-2006 à 16:44:22    

Bonjour,  
 
je voudrais savoir comment modifier ce code pour qu'il m'affiche la même chose mais ordonné suivant le nom .  
 
Merci  
 
list est de type List<Person>  
 
 

Code :
  1. public String affiche(){
  2.     StringBuilder sb  = new StringBuilder();
  3.    
  4.     for(Person p : list){
  5.         sb.append("Nom : " ).append(p.getName());
  6.         sb.append(", type : " ).append(p.getClass()).append("\n" );
  7.     }
  8.     return sb.toString();
  9.     }


Message édité par Gattuso le 24-04-2006 à 14:01:04
Reply

Marsh Posté le 23-04-2006 à 16:44:22   

Reply

Marsh Posté le 23-04-2006 à 16:47:05    

Code :
  1. public String affiche(){
  2.     StringBuilder sb  = new StringBuilder();
  3.    
  4.     Collections.sort (list)
  5.     for(Person p : list) {
  6.         sb.append("Nom : " ).append(p.getName());
  7.         sb.append(", type : " ).append(p.getClass()).append("\n" );
  8.     }
  9.     return sb.toString();
  10.     }


 
 
j'ai pas le courage de tester :o

Message cité 1 fois
Message édité par kadreg le 23-04-2006 à 16:47:59

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 23-04-2006 à 16:48:48    

Code :


kadreg a écrit :

Code :
  1. public String affiche(){
  2.    StringBuilder sb  = new StringBuilder();
  3.    
  4.    Collections.sort (list)
  5.    for(Person p : list) {
  6.        sb.append( "Nom : " ).append(p.getName());
  7.        sb.append( ", type : " ).append(p.getClass()).append( "\n" );
  8.    }
  9.    return sb.toString();
  10.    }


 
 
j'ai pas le courage de tester :o


Fonctionne si Person implémente Comparable (en comparant sur le nom bien sûr), mais ça va faire gueuler moinmoin :o
(accessoirement t'aurais pu utiliser code=java au lieu de cpp, feignasse :o)

Message cité 1 fois
Message édité par masklinn le 23-04-2006 à 16:57:04

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-04-2006 à 16:50:14    

Ah oui merde, je croyais qu'il triait des strings :o
 
et pour la balise, c'est lui qui a commencé

Message cité 1 fois
Message édité par kadreg le 23-04-2006 à 16:50:34

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 23-04-2006 à 16:59:38    

kadreg a écrit :

Ah oui merde, je croyais qu'il triait des strings :o


La vieille excuse http://membres.lycos.fr/angel2k/petrus/petrusmax.gif
 
Faut faire gaffe aussi sur le fait que Collections#sort effectue un sort in-place, donc faut faire une shallow copy de la liste avant le sort si on ne veut pas qu'elle soit stockée triée :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-04-2006 à 22:02:22    

masklinn a écrit :

Code :


 
Fonctionne si Person implémente Comparable (en comparant sur le nom bien sûr), mais ça va faire gueuler moinmoin :o
(accessoirement t'aurais pu utiliser code=java au lieu de cpp, feignasse :o)


La classe qui doit implémenter Comparable est abstraite, cela ne fonctionne pas .
Il n'y a pas d'autres méthodes ?

Reply

Marsh Posté le 23-04-2006 à 22:39:54    

Comparator, qu'on te dit.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-04-2006 à 22:42:17    

Gattuso a écrit :

La classe qui doit implémenter Comparable est abstraite


Heuu, et alors?
 
Je sais pas ce que t'as fumé, mais chez moi ça fonctionne très bien:

Code :
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4.  
  5. public abstract class Person implements Comparable<Person> {
  6.     private String name;
  7.     private String surname;
  8.     private String title;
  9.  
  10.     public static void main(String[] args) {
  11.         Manager manager = new Manager( "Doe", "John" );
  12.         CodeMonkey monkey = new CodeMonkey( "Monkey", "Code" );
  13.         
  14.         List<Person> employees = new ArrayList<Person>();
  15.         
  16.         employees.add(monkey);
  17.         employees.add(manager);
  18.         
  19.         System.out.println( "Pre-sort employees" );
  20.         for(Person p: employees) {
  21.             System.out.println(p);
  22.         }
  23.         System.out.println( "" );
  24.         Collections.sort(employees);
  25.         System.out.println( "Post-sort employees" );
  26.         for(Person p: employees) {
  27.             System.out.println(p);
  28.         }
  29.     }
  30.     
  31.     public Person(String name, String surname) {
  32.         this.name = name;
  33.         this.surname = surname;
  34.         this.title = getTitle();
  35.     }
  36.     public abstract String getTitle();
  37.  
  38.     public int compareTo(Person elm) {
  39.         return name.compareTo(elm.name);
  40.     }
  41.  
  42.     @Override
  43.     public String toString() {
  44.         StringBuffer out = new StringBuffer();
  45.         out.append(title);
  46.         out.append( " " );
  47.         out.append(surname);
  48.         out.append( " " );
  49.         out.append(name);
  50.         return  out.toString();
  51.     }
  52. }


Code :
  1. public class Manager extends Person {
  2.  
  3.     public Manager(String name, String surname) {
  4.         super(name, surname);
  5.     }
  6.  
  7.     @Override
  8.     public String getTitle() {
  9.         return "Manager";
  10.     }
  11. }


Code :
  1. public class CodeMonkey extends Person {
  2.  
  3.     public CodeMonkey(String name, String surname) {
  4.         super(name, surname);
  5.     }
  6.  
  7.     @Override
  8.     public String getTitle() {
  9.         return "Code Monkey";
  10.     }
  11.  
  12. }


 
Output:

Pre-sort employees
Code Monkey Code Monkey
Manager John Doe
 
Post-sort employees
Manager John Doe
Code Monkey Code Monkey


Person est abstract, c'est la classe qui implémente Comparable (et compareTo, ses classes dérivées ne touchent jamais à compareTo), ça marche [:john keats]  
 
Après, pour le débat sur Comparator/Comparable, joue avec -- il aime bien en discuter de manière calme et courtoise :o


Message édité par masklinn le 23-04-2006 à 22:46:54

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-04-2006 à 22:45:07    

non


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-04-2006 à 22:47:22    


mais si, fais donc pas ton timide :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-04-2006 à 22:47:22   

Reply

Marsh Posté le 24-04-2006 à 10:37:56    

C'est quoi le pb avec Comparable ?

Reply

Marsh Posté le 24-04-2006 à 10:56:19    

Je me répond a moi meme : c'est vrai qu'avec Comparable ca défini aussi l'égalité d'object, ca peut poser pb dans le cas de structure qui ne gere pas les doublons ...
 
j'y avait jamais pensé tiens

Reply

Marsh Posté le 24-04-2006 à 11:04:19    

en fait c'est Benou, spa -- [:dawao]
 
le truc, c'est qu'il y a mille facons de comparer deux objets "Person" et a ce titre que ca n'a pas de sens reel que la classe Person implemente Comparable (comparaison par age, par nom, taille de bite, que sais-je encore [:dawa] ) et il est donc preferable d'utiliser un Comparator dedie au type de comparaison que l'on souhait mettre en oeuvre [:romf]

Reply

Marsh Posté le 24-04-2006 à 11:04:48    

LvR a écrit :

C'est quoi le pb avec Comparable ?


Comparable ne devrait être utilisé que quand il y a un véritable ordre naturel aux objects, càd qu'il n'y a qu'une manière "sensible" de les comparer (exemple pour les nombres l'ordre naturel de comptage).
 
Les autres objets, pouvant potentiellement avoir de multiples bases de comparaisons (et d'ordonnancement) devraient utiliser des comparators (puisqu'ils n'ont pas de base de comparaison unique et intrinsèque, uniquement des conventions).
 
Exemple, les strings peuvent être comparés par ordre alphabétique (dictionnaire), mais il faut décider de la position que l'on donne aux lettres accentuées (aux caractères non-ascii en fait), au fait que la comparaison prenne en compte la casse ou pas, se demander si on effectue une comparaison numérique intelligente ou pas (== "foo2" devrait-il être avant ou après "foo10"? en comparaison alpha classique il sera après, en comparaison numérique intelligente il sera avant), etc etc etc.
 
Donc philosophiquement parlant les Strings par exemple ne devraient pas implémenter Comparable mais devraient en permanence utiliser des Comparators. En pratique néamoins dans la mesure ou le tri de chaînes le plus fréquent se fait par ordre lexicographique la majorité des langages (java compris) implémentent une comparaison par ordre lexicographique par défaut sur les strings.
 
C'est un cas classique de pûreté vs simplicité.
 
Ici, si la seule comparaison qui soit jamais effectuée est faite sur le nom autant utiliser Comparable (IMO), ça ne vaut pas le coup de se faire chier avec des Comparator.
Par contre si d'autres types de tris doivent être effectués (tri par âge, par profession, ...; et il est probable que ce soit le cas) mieux vaut passer par des Comparators on y gagne sur le long terme.

LvR a écrit :

Je me répond a moi meme : c'est vrai qu'avec Comparable ca défini aussi l'égalité d'object, ca peut poser pb dans le cas de structure qui ne gere pas les doublons ...
 
j'y avait jamais pensé tiens


L'utilisation de Comparator aussi définit des égalités [:spamafote]

souk a écrit :

en fait c'est Benou, spa -- [:dawao]
 
le truc, c'est qu'il y a mille facons de comparer deux objets "Person" et a ce titre que ca n'a pas de sens reel que la classe Person implemente Comparable (comparaison par age, par nom, taille de bite, que sais-je encore [:dawa] ) et il est donc preferable d'utiliser un Comparator dedie au type de comparaison que l'on souhait mettre en oeuvre [:romf]


Bien sûr que si c'est --, j'ai déjà débattu de ça avec lui :o

Message cité 2 fois
Message édité par masklinn le 24-04-2006 à 11:06:54

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-04-2006 à 11:06:45    

masklinn a écrit :


Ici, si la seule comparaison qui soit jamais effectuée est faite sur le nom autant utiliser Comparable (IMO), ça ne vaut pas le coup de se faire chier avec des Comparator.
Par contre si d'autres types de tris doivent être effectués (tri par âge, par profession, ...) mieux vaut passer par des Comparators on y gagne sur le long terme.


 
ouais, aussi [:romf]

Reply

Marsh Posté le 24-04-2006 à 11:15:27    

masklinn a écrit :


L'utilisation de Comparator aussi définit des égalités [:spamafote]


 
oui, oui, bien sur, mais ce que je voulais dire, c'est que Comparator n'est utilisé qu'a la demande, donc pas de risque d'effet de bord contrairement a Comparable, genre si on utilise un Set qui ne gère pas les doublons, si l'object implémente Comparable sur par ex le nom de la personne, on peut perdre des gens sans faire gaffe (si il y a plusieurs personnes avec le meme nom bien sur :P).
 
Apres pour savoir si la comparaison est légitime (naturelle) suivant l'objet, c'est un choix fonctionnel, je ne vais pas débattre la dessus ;)


Message édité par LvR le 24-04-2006 à 11:16:51
Reply

Marsh Posté le 24-04-2006 à 14:00:31    

Merci d'avoir résolu mon problème

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed