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 d'objets à plusieurs dimensions


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 32
    Points : 20
    Points
    20
    Par défaut Tableau d'objets à plusieurs dimensions
    bonjour, je veux coder un tableau d'objet a plusieurs diemension, lequel suggerer vous HashMap ou Arraylist, avez vous des exemples simples ?

  2. #2
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Points : 1 332
    Points
    1 332
    Par défaut
    Salut,

    Cela dépend de ce que tu veux faire!
    Tu peux avoir de simple tableaux comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int tabl1[] = {1, 2, 3, 5, 8, 13};
    String tabl2[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"};
    et les référencer avec leurs indexes (ici pour samedi tu as 13).

    Tu peux aussi créer une classe avec des attributs et créer un tableau d'objet de cette classe et avoir des méthodes de recherche et d'accès.

    Il y a plein de "collections" dans les APIs de Java ... et encore une fois ... cela dépend de ce que tu veux faire! Il faudra peut-être aussi considérer les tris ou les insertions!

    Cordialement

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Merci boijea, au faite j'aimerai utiliser Arraylist pour ces avantage mais je ne trouve pas comment le declarer de la meme facon que l'exemple suivant avec Hashage

    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
    public class MyGrids {
     
    	private HashMap gridList;
    	private HashMap gridMap;
     
    	public HashMap getGridMap() {
    		if (gridMap == null)
    			initGridMap();
     
    		return gridMap;
    	}
     
     
    	public void initGridMap() {
    		gridList = new HashMap();
    		Map row;
     
    		row = new HashMap();
    		row.put("colonne1", "value-ligne1");
    		row.put("colonne2", "value-ligne1");
    		row.put("colonne3", "value-ligne1");
    		row.put("colonne4", "value-ligne1");
    		row.put("colonne5", "value-ligne1");
    		gridList.put("value-ligne1", row);        
     
    		row = new HashMap();
    		row.put("colonne1", "value-ligne2");
    		row.put("colonne2", "value-ligne2");
    		row.put("colonne3", "value-ligne2");
    		row.put("colonne4", "value-ligne2");
    		row.put("colonne5", "value-ligne2");
    		gridList.put("value-ligne2", row);
     
                    gridMap = new HashMap();
    		gridMap.put("totalSize", new Integer(gridList.size()));
    		gridMap.put("data", gridList.values().toArray());
    	}

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Les tableaux à plusieurs dimensions sont gérés nativement en java...
    Tu n'as pas besoin d'utiliser des List ou des Map, qui ne sont pas forcément bien adaptées à ce problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[][] matriceEntiers = new int[3][3];
    Maintenant, si tu veux vraiment passer par des objets, tu as la solution des listes de listes de listes... Pour une matrice à 3 dimensions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<List<List<Integer>>>
    La permière liste contenant la première coordonnée, la deuxième liste la deuxième coordonnée, etc.
    Mathématiquement, on casse la symétrie du problème: tu n'as accès à la deuxième coordonnée qu'après avoir fixée la première, etc.

    Une approche plus mathématique (et à mon avis plus jolie) serait de passer par un objet "Coordonnees", qui serait la clé permettant d'accéder à la valeur correspondante dans une Map:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Coordonnees {
       private int x;
       private int y;
       private int z;
       // ...
    }
     
    public class TableauTroisDim extends Map<Coordonnees, Integer> {
       // ...
    }
    Attention dans ce cas à bien redéfinir les méthodes "equals", "hashcode", etc. de la classe Coordonnees, voire à définir un ordre sur les coordonnées (en implémentant l'interface "Comparable").

  5. #5
    En attente de confirmation mail
    Inscrit en
    Septembre 2009
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 269
    Points : 96
    Points
    96
    Par défaut
    Bonjour,
    je relance une discussion bien ancienne, il me semble.
    J'y ajoute une question thorique.
    Cyberchouan y a dit que pour une "liste de liste de liste"
    on pouvait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<List<List<Integer>>>
    .
    Je souhaite creer non pas une liste de 3 dimensions mais de cinquante.

    Je ne comprend pas la ligne
    Public class TableauTroisDim extends Map<Coordonnees, Integer>
    je suppose que c'est elle qui méviterait d'écrire un code absurde (entre autre).
    Pourquoi créer une telle liste de cinquante listes :

    les listes seront de longueur inégales :

    si j'utilise add.element pour une liste, elle s'allongera par rapport aux autres.

    En langage C je peux le faire avec des pointeurs sur pointeurs :
    (cinquante * s'il le faut aberrant mais theoriquement possible)
    Pourrais-je obtenir le même résultat en java qui est le langage que j'utilise maintenant et assez maladroitement. Ais-je intérêt a maitriser cette fameuse ligne plus haut (si je ne cours pas après des chimères).
    Il y a peut être beaucoup plus simple ex :int [][] tab = new int[50][50].

    Merci,

    Philippe

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    tout d'abord

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int [][] tab = new int[50][50]
    n'est pas la définition d'un tableau à 50 dimensions mais d'un tableau à 2 dimensions dont la taille est 50 x 50.

    Gérer un tableau à 50 dimensions sous forme de liste de liste de liste de ... serait carrément lourdingue.

    Quant au code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class TableauTroisDim extends Map<Coordonnees, Integer> {
       // ...
    }
    indique qu'on veut définir une nouvelle classe représentant un tableau à 3 dimensions en "étendant" l'interface Map, et en indiquant que les clefs sont des instances de classe Coordonnees et les valeurs de classe Integer.

    Premièrement, Map étant une interface, on extends pas, on implémente : on devrait donc écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class TableauTroisDim impléments Map<Coordonnees, Integer> {
       // ...
    }
    Mais ceci pose un autre petit problème : il est nécessaire d'implémenter l'ensemble des méthodes de l'interface Map, ce qui fait un travail conséquent et pas forcément utile pour la question à résoudre.

    On pourrait étendre HashMap à la place, pour éviter cette implémentation, mais personnellement, je trouve qu'offrir des méthodes de gestion de Map, sans rapport avec l'aspect tableau à n dimension, n'est pas très utiles et risque de rendre la gestion de la classe erratique. J'encapsulerais plutôt la map, et j'implémenterais uniquement les méthodes propres à l'aspect tableau à n dim (lire une valeur, écrire un valeur, toString() pour afficher, l'égalité, et éventuellement des méthodes standard de gestion de matrice si nécessaire)

    Ensuite pour gérer l'aspect dimension quelconque, plutôt que de créer n variables dans la classe Coordonnees, on pourrait gérer un tableau de coordonnées dont la taille serait le nombre de dimensions, mais ça pose un petit souci pour gérer la cohérence (on pourrait manipuler des coordonnées de dimensions différentes sur la même matrice, à gérer donc pour éviter les problèmes).
    En plus, pour un tableau, la taille est important également (à déterminer si on veut faire des matrices, donc la taille de chaque dimension est la même, ou des tableaux de dimensions différentes)


    Donc pour résumer, on peut faire une classe coordonnées :

    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
    public class Coordonnees {
     
          private int[] coordonnees;
     
        public Coordonnees(int dim) {
             this(new int[dim]);
        }
        public Coordonnees(int[] coordonnees) {
             this.coordonnees=coordonnees;
        }
     
        public int getNombreDimensions() {
           return coordonnes.length;
       }
     
        public void setCoordonnee(int dim, int valeur) {
            coordonnees[dim]=valeur;
        }
     
        public int getCoordonnee(int dim) {
          return coordonnes[dim];
    }
     
        ...
     
        // il est nécessaire d'écrire les méthodes hashCode() et equals(Object) pour rendre efficace la map.
     
    }

    Et pour le tableau :

    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
    public class TableauNDimensions<V> {
     
          private Map<Coordonnees, V> valeurs = new HashMap<Coordonnees, V>();
    private final int dim;
    private final int[] sizes;
         /**
           * @param dimension le nombre de dimensions du tableau
              @param sizes les tailles de chaques dimensions
           */
         public TableauNDimensions(int dimension, int[] sizes) {
            if( sizes.length!= sizes) throw new IllegalArgumentException();
            this.dim=dimension;
            this.sizes=sizes;
         }
     
         public TableauNDimensions(int dimension, int size) {
            this(dimension, createTabSizes(dimension,size));
    }
     
        private static int[] createTabSizes(int dimension,int size) {
    int[] tab = new int[dimension];
    Arrays.fill(tab, size);
    return tab;
    }
     
        /** verifie que les coordonnées sont valides */
        public final boolean verifie(Coordonnee xyz) {
    if (xyz.getNombreDimensions() !=dim) return false;
              for(int i=0; i<dim; i++) {
                  if ( xyz.getCoordonnee(i)<0 || xyz.getCoordonnee(i)>= sizes[i] )  return false;
              }
               return true;
        }
     
         public void setValeur(Coordonnees xyz, V valeur) {
             if ( verifie(xyz) ) {
                   valeurs.put(xyz,valeur);
             }
             else throw new IllegalArgumentException("Coordonnees de mauvaise dimension");
         }
     
         ...
     
     
    }
    Et pour faire par exemple un tableau d'entiers à 50 dimensions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Tableau50Dimensions extends TableauNDimensions<Integer> {
     
           public Tableau50Dimensions(int[] sizes) {
               super(50,sizes);
           }
           public Tableau50Dimensions(int size) {
               super(50,size);
           }
     
    }
    PS : j'ai tapé directement dans le forum, il y'a peut être quelques erreurs de frappe

  7. #7
    En attente de confirmation mail
    Inscrit en
    Septembre 2009
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 269
    Points : 96
    Points
    96
    Par défaut
    Merci,

    j'apprécie ta réponse qui est complète, et qui me confirme que mon intention n'était pas accessible très facilement.
    Je vais chercher à progresser lentement mais surement sur ce cas et je te remercie à nouveau

    aurevoir

    Philippe

  8. #8
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Pour faire un tableau d'Integer de N dimensions avec des objets, il suffit de List<List<Integer>>. Ensuite, il faut ajouter un objet List<Integer> par dimension. S'il y en a 1, on a un tableau à 1 dimension, s'il y en a 2, on a un tableau à 2 dimensions, ...
    Eventuellement, on peut vouloir surclasser la liste principale afin de s'assurer que les liste de chaque dimension possedent bien le bon nombre d'elements (50 par exemple pour un tableau 50x50).

  9. #9
    En attente de confirmation mail
    Inscrit en
    Septembre 2009
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 269
    Points : 96
    Points
    96
    Par défaut
    Cela ne risque pas de générer une syntaxe un peu dingue ?

    Philippe

  10. #10
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       int[] dims = {3, 4, 5 ,8,10, 5, 7, 9} ;
        Object bigArray=  Array.newInstance(int.class, dims) ;

  11. #11
    En attente de confirmation mail
    Inscrit en
    Septembre 2009
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 269
    Points : 96
    Points
    96
    Par défaut
    merci, plus avec humour !
    philippe
    (je ne sais pas si je trouverai le bouton résolu, il n'était pas là tt à l'heure)

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

Discussions similaires

  1. [PHP 5.1] Trie multicritère d'un tableau d'objets à une dimension.
    Par marcandre dans le forum Langage
    Réponses: 2
    Dernier message: 14/09/2010, 16h01
  2. Réponses: 3
    Dernier message: 29/01/2010, 14h28
  3. Réponses: 3
    Dernier message: 26/05/2006, 19h49
  4. Réponses: 7
    Dernier message: 19/01/2006, 18h57
  5. tableau à plusieurs dimensions
    Par pekka77 dans le forum C
    Réponses: 11
    Dernier message: 07/02/2005, 19h42

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