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 :

syntaxe des tableaux[]


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut syntaxe des tableaux[]
    bonjour à tous,

    j'ai plusieurs tableaux de composants différents : comp, lampe, interrupteur....

    Quand je veux créer un nouveau composant, je parcours le tableau qui stocke ces derniers, et je prends le premier index ou l'objet est "null", c'est à dire non défini, car cet emplacement est donc libre.
    le code partiel est :

    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 static void clic_sur_recept( int r, int ix, int iy) {
     
    			JOptionPane.showMessageDialog(null, " clic sur recept : " + r + "   on va créer un " + Var.matériel);
    			String toto = "Var." + Var.matériel;
    			JOptionPane.showMessageDialog(null, " toto =  : " + toto);
    				if (Var.matériel== "lampe") {
    						// si une ligne du tableau "comp" est dispo, on l'attribue au prochain composant
    							for (int n=0; n<Const.nb_R; n++) {
     
    									if (Var.comp[n] == null) {
    							//			JOptionPane.showMessageDialog(null, " je vais créer le comp : " + i );
     
    										attribComp(r, ix, iy, n) ;
    										break;
    									}
    							}
    				}
    		}
    A la ligne 10, je cherche un emplacement libre dans le tableau "comp" de la classe Var.
    Cela fonctionne mais je dois répéter ce code pour tous mes tableaux contenant des objets.

    J'ai tenté de créer une chaine "toto" à la ligne 4, contenant le début de la référence au tableau : "Var." en concaténant avec le contenu de la variable "Var.matériel", qui contient le nom du tableau.
    La chaine ainsi obtenue est ok, et c'est : "Var.comp".

    En étant un peu trivial, j'ai tenté de remplacer la ligne 10 par : "if ( toto[n] == null)" ......
    mais cela ne fonctionne pas, car le programme cherche un tableau toto[] et n'interprète pas ce "toto" comme son contenu qui est "Var.comp", qui lui, est un vrai tableau qui fonctionne.

    Ma question est donc : est-il possible d'indiquer le nom d'un tableau sur lequel travailler, non pas directement avant les crochets d'indexation "[]" mais dans une variable dont on peut remplir la valeur avec le nom du tableau à traiter???

    Bravo à ceux qui comprendront la question, déja!!

    Merci à ceux qui tenteront une réponse!!

  2. #2
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    Bonjour,

    A priori il faudrait passer par une Map de List.

    Exemple (avec un bloc-notes) :
    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
      // tableau associatif : clé = type de composant, valeur = liste de composants
      Map<String, List> mapComposants = new HashMap<String,List>();
      
      // on prépare une liste par type de composant
      mapComposants.put("lampe", new ArrayList());
      
      [...] 
      
      List<Object> tableauComposants = (List<Object>)mapComposants.get( typeComposant );
      if (tableauComposants != null) {
        // si une ligne de la liste est dispo, on l'attribue au prochain composant
        int n = 0;
        while ((n<Const.nb_R) && (tableauComposants[n] != null)) {
        attribComp(r, ix, iy, n) ;
        break;
           }
          n++;
      }
    Les différents "tableaux" sont ainsi accessibles par la clé qui définit leur type ("lampe" par exemple) et doivent être remplis par des listes (ArrayList par exemple) contenant les composants.


    Autre chose : la ligne suivante est erronée :
    if(Var.matériel== "lampe")

    Pour les comparaisons de String, il faut utiliser s1.equals(s2), d'une part, pas l'opérateur == qui ne vérifiera pas la valeur mais la référence. Et les initiales majuscules sont réservées aux types de données (comme String ou List), pas aux objets.

  3. #3
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    Soit on continue d'utiliser des tableaux et on fait une map de tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Map<String, Object[]> mapComposants = new HashMap<>();
    mapComposants.put("lampe", new Object[]);
     
      // [...] 
     
      Object[] tableauComposants = mapComposants.get( Var.materiel ); // le cast est inutile)
    Soit on utilise une List, et autant utiliser ses capacités d'ajout/suppression plutôt que de gérer des "emplacements" null. A moins que l'index soit utilisé dans la gestion (au quel cas, on peut utiliser une Map<Integer,...> pour l'accès direct par l'index).
    D'ailleurs, il y a une erreur dans le code de @Cincinnatus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ((n<Const.nb_R) && (tableauComposants[n] != null)) {
    tableauComposants étant une List, ça devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ((n<Const.nb_R) && (tableauComposants.get(n) != null)) {


    Une autre approche serait d'utiliser un switch pour affecter la variable intermédiaire :

    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
    Object[] tableauComposants; 
    // on cherche le tableau qu'on veut utiliser en fonction du type de matériel
    switch(var.materiel) {
    case "lampe":
       tableauComposants  = var.lampe;
       break;
    case "comp":
       tableauComposants  = var.comp;
       break;
    case "interrupteur":
       tableauComposants = var.interrupteur;
       break;
    default:
       tableauComposants  = null; 
    }
     
    if( tableauComposants!=null ) { 
        // ... chercher un emplacement libre dans tableauComposants
    }
    }
    Mais l'avantage d'une Map est qu'on peut ajouter des nouveaux types de composants sans avoir à modifier le code (du switch).


    PS: éviter les accents dans les noms (Var.materiel au lieu de Var.matériel)
    PS2: attention à la confusion possible entre une variable de nom "var" et le "type" var.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    D'ailleurs, il y a une erreur dans le code de @Cincinnatus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ((n<Const.nb_R) && (tableauComposants[n] != null)) {
    tableauComposants étant une List, ça devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ((n<Const.nb_R) && (tableauComposants.get(n) != null)) {
    Exact, mea culpa ! J'ai voulu adapter depuis un tableau et sans compiler, donc sans filet...

  5. #5
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut merci à Cincinnatus et joel.drigo
    Merci pour votre réactivité et vos précieuses pistes que je vais tenter d'exploiter au mieux...

    En effet, l'indexation des objets est utile car je m'en sers pour ensuite gérer ces objets au fil de l'exécution du programme.

    A bientôt peut-être pour d'autres problématiques, car je manque encore de connaissances solides....

  6. #6
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut quelques précisions à venir....
    j'ai réalisé un petit test pour essayer les Maps.

    J'ai trois tableaux (les listes me gènent car je travaille avec l'indexation pour retrouver mes objets ensuite...)

    j'ai deux types différents : Strings et Color.

    Je mets mes trois tableaux dans la map, puis je récupére le tableau de "Color" dans le tableau de type "Object" nommé "test", puis j'ajoute la couleur jaune à l'index libre (le 2).
    A la fin j'affiche le conenu de "test" et de "color".

    Le code est :

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    import java.awt.Color;
    import java.util.HashMap;
    import java.util.Map;
     
    public class Main {
     
    	public static void main(String[] args) {
     
    		Color[] color = new Color[10];
    		String couleur[] = new String[10];
    		String [] nombre = new String[10]	;
     
     
    		// tableau "couleur" de type String
    		couleur[0] = "noir";
    		couleur[1] = "marron";
    		couleur[2] = "rouge";
    		couleur[3] = "bleu";
    		couleur[4] = "vert";
     
    		// tableau "nombre" de type String
    		nombre[0] = "zéro";
    		nombre[1] = "un";
    		nombre[2] = "deux";	
     
    		// tableau "color de type Color
    		color[0] = Color.black;
    		color[1] = Color.white;
     
     
    		// ma map de tableaux de STrings
    		// 1,2,3 : clé d'accès à la valeur	||  couleur, nombre, color : valeur choisie (ici, c'est un tableau)
    		Map <String,  Object[]> ma_map = new HashMap();
    		ma_map.put("1", couleur);
    		ma_map.put("2", nombre);
    		ma_map.put("3", color);
     
    		// ma récupération du tableau de la map dans un tableau de test
    		Object[] test = new Object[10];
    		test = ma_map.get("3");
     
    		// chercher une place libre pour mettre le "jaune" à l'index 2.
    		for (int i=0; i<test.length; i++) {
    			if (test[i]==null) {
    				test[i] = Color.yellow;
    				System.out.println("j'ai bien mis le jaune à l'index 2.");
    				break;
    			}
    		}
     
     
    		// affichage du contenu du tableau récupéré
    		int i = 0;
    		while (test[i] != null) {
    			System.out.println("test[" + i + "] = " + test[i] + "             et color[" + i + "] = " + color[i]);
    			i++;
    		}
     
     
    	}
    }


    le résultat est le suivant :

    j'ai bien mis le jaune à l'index 2.
    test[0] = java.awt.Color[r=0,g=0,b=0] et color[0] = java.awt.Color[r=0,g=0,b=0]
    test[1] = java.awt.Color[r=255,g=255,b=255] et color[1] = java.awt.Color[r=255,g=255,b=255]
    test[2] = java.awt.Color[r=255,g=255,b=0] et color[2] = java.awt.Color[r=255,g=255,b=0].

    Cela semble fonctionner mais deux questions me gênent pourtant :

    1/ A la ligne 40, je mets le tableau de "Color" de la map, dans mon tableau de test de type "Object".
    Les deux types des tableaux ne sont donc pas rigoureusement identiques.
    Comment se fait-il que je puisse, à la ligne 45, affecter "Color.Yellow" dans le tableau test qui est "Object" et non "Color" sans devoir faire un "cast"??

    2/ A l'index 2 du tableau "test", j'ai mis la couleur jaune. A l'affichage, cette couleur apparait bien dans le "test[2], mais également dans le color[2], sans que je sois intervenu...
    Cela m'arrange plutôt, car c'est le but pour moi, mais cet mise à jour des tableaux initiaux est-elle tout le temps automatique?...

    Merci à ceux qui se pencheront sur mes interrogations....

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

Discussions similaires

  1. Est ce que ce syntaxe est juste ?( a propos des tableaux)
    Par lahdili.reda dans le forum Langage
    Réponses: 7
    Dernier message: 20/06/2012, 13h56
  2. Réponses: 101
    Dernier message: 20/09/2010, 10h20
  3. Réponses: 39
    Dernier message: 11/08/2010, 09h28
  4. [Tableaux] syntaxe des guillemets
    Par tioseb dans le forum Langage
    Réponses: 13
    Dernier message: 31/01/2006, 14h35
  5. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30

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