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

Collection et Stream Java Discussion :

Problème avec le type GregorianCalendar


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Par défaut Problème avec le type GregorianCalendar
    Bonjour,
    par avance je suis désolé si le sujet a déjà été posté mais je n'ai pas trouvé de réponse à mon problème en cherchant.
    Voilà : j'ai déclaré une variable date_naissance de type GregorianCalendar dans une classe "Adherent".
    J'ai vu qu'on pouvait construire un objet de ce type avec 3 paramètres :
    GregorianCalendar(int year, int month, int date)
    Constructs a GregorianCalendar with the given date set in the default time zone with the default locale.
    J'ai donc 3 paramètres dans mon constructeur qui me permettent de construire la date de naissance. Ensuite, je surcharge toString pour afficher un adherent comme je veux. Seulement, l'affichage foire complètement.
    Est-ce qu'il y a quelque chose qui je fais pas bien ? Peut-être que j'utilise mal le type GregorianCalendar ?

    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
    package appliadac;
     
    import java.util.ArrayList;
    import java.util.GregorianCalendar;
     
    public class Adherent {
    	private int numero;
    	private String nom;
    	private String prenom;
    	private String ville;
    	private GregorianCalendar date_naissance;
    	private static ArrayList<Adherent> TousLesAdherents = new ArrayList<Adherent> ();
     
    	public Adherent(int numeroN, String nomN, String prenomP, String villeV, int yearY, int monthM, int dayD) {
    		numero = numeroN;
    		nom = nomN;
    		prenom = prenomP;
    		ville = villeV;
    		date_naissance = new GregorianCalendar(yearY, monthM, dayD);
    		TousLesAdherents.add(this);
    	}
     
     
    	public static void affichertout() {
    		for(Adherent A : TousLesAdherents) {
    			System.out.println(A);
    		}
    	}
     
    	public String toString() {
    		return "N°" + numero + " : " + nom + " " + prenom + " residant a " + ville + " (ne le " + date_naissance + ")";
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package appliadac;
     
    public class Application {
     
    	public static void main(String[] args) {
    		new Adherent(1, "dupond", "bob", "paris", 89, 1, 03);
    		new Adherent(2, "durant", "alfred", "versailles", 90, 7, 21);
    		Adherent.affichertout();
    	}
    }
    Voici ce que donne l'exécution :
    N°1 : dupond bob residant a paris (ne le java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Paris",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=?,YEAR=89,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?])
    N°2 : durant alfred residant a versailles (ne le java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Paris",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=?,YEAR=90,MONTH=7,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=21,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?])

  2. #2
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Salut.

    C'est pas que ça foire complètement, c'est juste que tu affiches des variables GregorianCalendar et que la méthode toString de GregorianCalendar est très bavarde.

    Au cas où, pour un affichage plus propre, dans ta méthode toString(); tu peux tranformer ton objet GregorianCalendar en Date et utiliser un SimpleDateFormat pour formater son affichage.

    Exemple :

    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
     
    package appliadac;
     
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.GregorianCalendar;
     
    public class Adherent {
    	private int numero;
    	private String nom;
    	private String prenom;
    	private String ville;
    	private GregorianCalendar date_naissance;
    	private static ArrayList<Adherent> TousLesAdherents = new ArrayList<Adherent> ();
     
    //le SimpleDateFormat utilisé pour l'affichage des dates.
    	private static final SimpleDateFormat formateur = new SimpleDateFormat("dd/MM/yyyy");
     
    	public Adherent(int numeroN, String nomN, String prenomP, String villeV, int yearY, int monthM, int dayD) {
    		numero = numeroN;
    		nom = nomN;
    		prenom = prenomP;
    		ville = villeV;
    		date_naissance = new GregorianCalendar(yearY, monthM, dayD);
    		TousLesAdherents.add(this);
    	}
     
     
    	public static void affichertout() {
    		for(Adherent A : TousLesAdherents) {
    			System.out.println(A);
    		}
    	}
     
    	public String toString() {
    		return "N°" + numero + " : " + nom + " " + prenom + " residant a " + ville + " (ne le " + formateur.format(date_naissance.getTime()) + ")";
                   //utilisation du formateur de date
    	}
     
     
    }
    Par contre, fais gaffe avec les GregorianCalendar, pour une raison qui me dépasse, les mois sont comptés de 0 (Janvier) à 11 (Décembre). Il est préférable d'utiliser les constantes de mois définies dans GregorianCalendar pour ne pas se tromper comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static void main(String[] args) {
    	new Adherent(1, "dupond", "bob", "paris", 89, GregorianCalendar.JANUARY, 03);
    	new Adherent(2, "durant", "alfred", "versailles", 90, GregorianCalendar.JULY, 21);
    //utilisation des constantes GregorianCalendar
    	Adherent.affichertout();
     
    }
    Ou alors tu retranches 1 au mois dans ta classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public Adherent(int numeroN, String nomN, String prenomP, String villeV, int yearY, int monthM, int dayD) {
    		numero = numeroN;
    		nom = nomN;
    		prenom = prenomP;
    		ville = villeV;
    		date_naissance = new GregorianCalendar(yearY, monthM-1, dayD);//on retranche 1 au mois
    		TousLesAdherents.add(this);
    	}

    Enfin, si je peux me permettre, ta conception est moyenne car ta classe représente en même temps un adhérent et un conteneur d'adhérent.

    Il faudrait mieux séparer ces 2 aspects à mon avis.




    Edit : J'ajouterai que dans la prochaine version de Java, il y aura une nouvelle API pour les dates bien plus claire et pratique qui fera son apparition.

    Cette API, Joda-Time, est déjà disponible , si tu veux regarder.

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Par défaut
    Wouah, j'en attendais pas tant !
    Merci beaucoup pour cette réponse très complète et très instructive ! Ca va beaucoup m'aider. Je vais jeter un coup d'oeil à Joda-Time, ça a l'air intéressant

    Sinon, pour ce qui est de ma classe "Adherent" qui est en même temps un conteneur de plusieurs objets de cette même classe, moi non plus je ne trouve pas ça top mais c'est un projet que je réalise pour mes études et le prof veut qu'on fasse comme ça pour le moment. On apprendra peut-être à améliorer ça plus tard...

    En tout cas, merci encore pour tout, c'est très sympa.

    Bonne continuation,
    Cordialement

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut
    Citation Envoyé par faLco3 Voir le message
    e prof veut qu'on fasse comme ça pour le moment. On apprendra peut-être à améliorer ça plus tard...
    ce "peut-être" depend-il du budget de l'éducation nationale?

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Par défaut
    lol, non je ne pense pas, cela dépend plutôt du rythme relativement lent imposé par le besoin que tous les étudiants comprennent ce qu'on fait avant de continuer !

    Sinon, pour en revenir à la remarque initiale, en continuant mon projet j'ai réfléchi un peu et je me suis dit que finalement c'était peut-être mieux de mettre des listes static pour "sauvegarder" tous les objets d'une class. En effet, j'en ai discuté avec un ami et l'avantage de ce procédé est qu'il permet d'accéder très simplement à "l'ensemble" des objets de la class, puisque la liste est privée. Si on mettait des objets "Liste" pour chaque class, on aurait des tas de méthodes supplémentaires et un nombre de class doublé. Ça semble plus contraignant, alors même si d'un point de vu conceptuel c'est pas très logique que les objets d'un type aient une liste commune qui les contient tous, c'est plus facile à gérer en codant.
    Non ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut
    si j'ai bien compris tu veux crées des objets "Liste" pour regrouper tes objets.

    Quand tu utilises java c'est pour profiter de la puissance du framework qui vient avec.

    Y a tout un framework "Collections" qui serrent à manipuler un ensemble d'objets (de même type-utilises les génériques à partir de java 5 - ou pas).

    regarde du côtés du java.util.*

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/11/2005, 20h40
  2. Problème avec le type BLOB dans oracle
    Par pguedia dans le forum Oracle
    Réponses: 1
    Dernier message: 10/11/2005, 17h33
  3. problème avec le type timestamp
    Par aline dans le forum Oracle
    Réponses: 6
    Dernier message: 21/02/2005, 10h05
  4. [Débutant][Phppgadmin] problème avec les types
    Par PoY dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2004, 17h06
  5. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48

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