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 :

Tableau multi-colonne : multi-type


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut Tableau multi-colonne : multi-type
    Bonsoir,

    débutant en Java, je rencontre un problème en ne sachant de qu'elle façon je dois organiser les données.

    Je souhaiterai stocker dans un "tableau", ou autres, des données de ce style :

    Ville/population/superficie/ et à terme pouvoir faire un tri sur un des champs.

    Quelle est la voie à suivre.

    Merci de votre aide.

  2. #2
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Bonsoir,

    Une première réponse assez simple sera de créer une classe Ville qui prendrait en propriété un nom, une population et une superficie. A cette classe, tu ajoutes un ArrayList de Ville et tu as ton tableau.
    A l'aide des Collections et d'un nouveau Comparator, les tris sur le tableau seront possibles.

    A toi de voir si cette solution répond bien à ton besoin.

    Benoit.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut
    Bonjour,

    tout d'abord merci pour ta réponse rapide.

    J'ai essayé de mettre en place quelque lignes suivant ton conseil, et je pense que cela devrait donc ressembler à ça :

    Reste à voir pour les Comparator, mais ce n'est pas gagné !!!

    Michel

    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
    import java.util.ArrayList;
    import java.util.List;
     
    public class Dev {
    	public static void main(String[] args) {
    		List<Ville> liste = new ArrayList<Ville>();
     
    		liste.add(new Ville("Paris", 1505452, 4785845));
    		liste.add(new Ville("Nantes", 8512563, 6235847));
    		liste.add(new Ville("Rennes", 8512563, 6235847));		
     
    		for (Ville s : liste) {
    			System.out.print(s.getNom() + "\t");
    			System.out.print(s.getPopulation() + "\t");
    			System.out.println(s.getSuperficie());
    		}
    	}
    }
    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
    public class Ville {
    	private String nom;
    	private int population;
    	private int superficie;
     
    	public Ville(String inNom, int inPopu, int inSuper) {
    		nom = inNom;
    		population = inPopu;
    		superficie = inSuper;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public int getPopulation() {
    		return population;
    	}
     
    	public int getSuperficie() {
    		return superficie;
    	}
    }

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut
    J'ai bien rajouté cette classe, tri sur nom, mais je ne sais point comment l'appeler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Comparator {
    	public int compare(Object nom1, Object nom2){
     
    		String nom1Value = ((Ville)nom1).getNom();        
            String nom2Value = ((Ville)nom2).getNom();
     
            return nom1Value.compareToIgnoreCase(nom2Value);    
        }
    }

  5. #5
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Tu trouveras un exemple avec Comparator par ici :
    http://www.developpez.net/forums/d33...tri-arraylist/

    Il existe une autre méthode, avec Comparable, décrite par là :
    http://java.developpez.com/faq/java/...rierCollection

    Benoit

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut
    Bon, ben, ça fonctionne une fois lu les liens que tu m'as donné.

    Un grand merci pour cette aide.

    Ne reste plus qu'à voir plus finement les Comparator.

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import java.util.Comparator;
     
    public class nameComparator implements Comparator<Ville>{
     
    	public int compare(Ville nom1, Ville nom2){
        	String nom1Value = nom1.getNom();        
            String nom2Value = nom2.getNom();
            return nom1Value.compareToIgnoreCase(nom2Value);    
        }
    }
    Appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(liste, new nameComparator());

  7. #7
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Tu peux aussi envisager une classe Comparator générique pour ton objet Ville. Le constructeur de cette classe prendrait en paramètre le type de tri que tu souhaites faire (tri sur le nom, tri sur la population...).

    Bonne étude des comparators !

    Benoit

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut
    Effectivement ce serait logique de finaliser dans ce sens, mais je ne vois pas trop comment faire avec la méthode compare(). Comment lui indiquer les deux champs à comparer, suivant le choix, et comment choisir la méthode dans la mesure où il y a de l'alpha ou du numérique, mis à part un TRY.

  9. #9
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    En rajoutant une propriété dans ta classe qui correspond à ton type de comparaison. Cette propriété sera initialisée par le constructeur auquel il faudra aussi rajouter un paramètre.

    Et dans la méthode compareTo() qui prendra toujours en entrée 2 villes, selon le type de comparaison (cf. variable créée juste au-dessus), il faudra faire une comparaison sur la ville, ou sur la population...

    Benoit

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut
    Bon, pour le constructeur et l'appel de fonction, je devrais y arriver. Bien que !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // 0 => num ; 1 => alpla
    Collections.sort(liste, new nameComparator(1));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class nameComparator implements Comparator<Ville> {
    	int setType;
     
    	public nameComparator(int flag){
    		setType = flag;		
    		}
    ....
    Maintenant je ne vois pas très bien comment gérer les divers appels getNom(), getPopulation(), peut être au travers de if

  11. #11
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Le principe est là.

    J'fais 2 petits hors sujet : le nom de la classe devrait commencer avec une majuscule, le 0 et le 1 seraient à mettre sous forme de constante (ça sera un plus pour la compréhension et la maintenance.

    Pour revenir dans le sujet d'origine, en pseudo code, ça donnerait :
    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 int compare(Ville ville1, Ville ville2)
    	{
    		int compareValue;
    		if (typeTri == TRI_NOM) {
    			compareValue = comparaison(ville1.getNom(), ville2.getNom());
    		} else if (type == TRI_POPULATION) {
    			compareValue = comparaison(ville1.getPopulation(), ville2.getPopulation());
    		} else if (type == TRI_SURFACE) {
    			...
    		} else {
    			// à prévoir
    		}
     
    		return compareValue;  
    	}
    Benoit

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut
    Une dernière petite question, enfin j'espère !!!!!

    Les constantes :

    final static int TRI_NOM = 1;
    final static int TRI_POPU = 2;
    final static int TRI_SUPER = 3;

    je les place où pour avoir une portée globale ?

  13. #13
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Vu qu'il s'agit de constantes pour le fonctionnement interne de la classe Comparator, je dirai dans celle-ci. Et vu que tu auras besoin de ces constantes lors de l'instanciation de la classe, il faudra les rendre public.

    Benoit

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Points : 179
    Points
    179
    Par défaut
    Bon, je crois que l'on y est arrivé, ouf !!!!

    Je mets le code ici, ça peut toujours servir.

    Et encore merci Benoit !!!!

    Michel

    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
    49
    import java.util.ArrayList;
    import java.util.Collections;
     
    public class Dev {
     
    	public static void main(String[] args) {
     
    		ArrayList<Ville> liste = new ArrayList<Ville>();
     
    		liste.add(new Ville("Paris", 1505452, 4785845));
    		liste.add(new Ville("Nantes", 8512563, 6235847));
    		liste.add(new Ville("Rennes", 8412563, 7035847));		
     
    		// print liste départ
    		System.out.println("=> Base Ville  (nom, popu, super)");		
    		for (Ville s : liste) {
    			System.out.print(s.getNom() + "\t");
    			System.out.print(s.getPopulation() + "\t");
    			System.out.println(s.getSuperficie());
    		}
     
    		System.out.println();		
    		System.out.println("=> Tri Nom");
    		Collections.sort(liste, new FieldComparator(FieldComparator.TRI_NOM));
    		for (Ville s : liste) {
    			System.out.print(s.getNom() + "\t");
    			System.out.print(s.getPopulation() + "\t");
    			System.out.println(s.getSuperficie());
    		}
     
    		System.out.println();		
    		System.out.println("=> Tri Population");
    		Collections.sort(liste, new FieldComparator(FieldComparator.TRI_POPU));
    		for (Ville s : liste) {
    			System.out.print(s.getNom() + "\t");
    			System.out.print(s.getPopulation() + "\t");
    			System.out.println(s.getSuperficie());
    		}
     
    		System.out.println();		
    		System.out.println("=> Tri Superficie");
    		Collections.sort(liste, new FieldComparator(FieldComparator.TRI_SUPER));
    		for (Ville s : liste) {
    			System.out.print(s.getNom() + "\t");
    			System.out.print(s.getPopulation() + "\t");
    			System.out.println(s.getSuperficie());
    		}				
    	}
    }
    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
    public class Ville{
    	private String nom;
    	private int population;
    	private int superficie;
     
    	public Ville(String inNom, int inPopu, int inSuper) {
    		nom = inNom;
    		population = inPopu;
    		superficie = inSuper;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public int getPopulation() {
    		return population;
    	}
     
    	public int getSuperficie() {
    		return superficie;
    	}
    }
    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
    import java.util.Comparator;
     
    public class FieldComparator implements Comparator<Ville> {
     
    	final static public int TRI_NOM = 1;
    	final static public int TRI_POPU = 2;
    	final static public int TRI_SUPER = 3;
     
    	int typeTri;
     
    	public FieldComparator(int flag) {
    		typeTri = flag;
    	}
     
    	public int compare(Ville ville1, Ville ville2) {
    		int compareValue = 0;
    		if (typeTri == TRI_NOM) {
    			compareValue = comparaisonAlpha(ville1.getNom(), ville2.getNom());
    		}
    		if (typeTri == TRI_POPU) {
    			compareValue = comparaisonNum(ville1.getPopulation(),
    					ville2.getPopulation());
    		}
    		if (typeTri == TRI_SUPER) {
    			compareValue = comparaisonNum(ville1.getSuperficie(),
    					ville2.getSuperficie());
    		}
    		return compareValue;
    	}
     
    	private int comparaisonAlpha(String value1, String value2) {
     
    		return value1.compareTo(value2);
    	}
     
    	private int comparaisonNum(int value1, int value2) {
    		if(value1 > value2)
                return 1;
            else if(value1 < value2)
                return -1;
            else
                return 0;
    	}
    }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/03/2014, 02h42
  2. Graphique avec un tableau multi-multi-colonne
    Par koolway dans le forum Excel
    Réponses: 7
    Dernier message: 12/06/2009, 08h01
  3. [BP7] Multi-cpu, multi-core, multi-thread et programme Pascal
    Par Transgarp dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 07/04/2008, 18h43
  4. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 08h02
  5. un trombinoscope multi colonne en xsl
    Par philou44 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 08/10/2004, 15h38

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