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 :

String et nom de variable


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut String et nom de variable
    Bonjour,

    La question c'est

    Dans le code source de la classe
    j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String code4245 = "quelquechose"
    jusque là facil de faire appel à ce String, en faisant code4245

    mais le problème est que ce String est code+4chiffres qui peuvent varier lorsque j'execute un autre programme genere le code source de cette classe

    donc le nom du String c'est "code" + N, N est connu
    mais comment je fais pour appeler ce String, pour connaitre sa valeur en utilisant N de façon automatique

    il faudrait une sorte de caractère * comme en ligne de commande pour faire String s=code**** et ça recherche un String parmi les variables avec un nom començant par code

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut
    la variabke String que je veut recupérer est pas listée dans un tableau , je sais pas auparavant comment elle s'appellera
    c'est "code"+un nombre tiré au hasard n connu
    comment je peux recuperer les variables? je crois pas que c'est possible

    le probleme c'est que sans le nombre tiré au hasard j'ai juste à invoquer code et ça retourne la valeur stocké dans la chaine code
    là avec n, j'aimerais invoqué (code+n) code concaténé avec le nombre n, mais comment faire ça

    <code>int n = 80;
    String code80="bonjour";

    String s = "code".concat(n);[/CODE]

    mais s va contenir "code80" et pas "bonjour" comme je voudrai

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Du genre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String s = "coucou";
    int i = 12;
    String c = s + i;
    EDIT : EN fait, j'ai pas compris ce que tu voulais...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut
    c'est pas exactement ça
    c'est le nom de la variable qui a les chiffres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String s = "coucou";
    String s2020 = "coucou!";
    int n=2020;
    comment recuperer la valeur vers laquelle pointe s2020 cad "coucou!"
    avec "s" et n comme données

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Je crois... (j'ai bien dit je crois) (si j'ai compris (je suis vraiment pas sûr)) => il faut que tu utilises une Map.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Map<Integer, String> map = new HashMap<Integer, String>();
     
    map.put(12345, "coucou");
    map.put(12, "salut");
     
    map.get(12345) -> retourne "coucou"
    map.get(12)   -> retourne "salut"

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    avec reflection ? :

    int V = 123456;
    Field f = g.getClass().getDeclaredField("TOTO_"+V);
    String valeur = (String) f.get(g);

    (en imaginant g qui est ta classe) ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut
    Citation Envoyé par wax78 Voir le message
    avec reflection ? :

    int V = 123456;
    Field f = g.getClass().getDeclaredField("TOTO_"+V);
    String valeur = (String) f.get(g);

    (en imaginant g qui est ta classe) ?
    ok merci
    alors si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String code123 = "salut";
    int N=123;
    Field f=getClass().getDeclaredField("code"+N);
    String valeur=
    System.out.println(valeur); // devrait retourner "salut"
    est ce que Field c'est
    java.lang.reflect.Field?
    est ce que je peux obtenir g avec getClass().getName()?

  8. #8
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Oui c'est bien Java.Lang.Reflection.

    Non tu ne peux pas obtenir G comme ça (getName() te retourne un string).


    Par contre, tu as utilisé This (dans ton exemple) à la place de "mon" g.

    Tu le remplace donc soit par This si tu veux récupérer une variable dans la classe courante ou alors par une autre classe. (Enfin je ne comprend pas la question a mon avis).

    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    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
    Honnêtement, je suis pas convaincu de l'utilité de la reflexion dans ce cas là.

    La solution donnée par millie me semble correspondre au besoin et est plus simple à mettre en œuvre que la réflexion.

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Oui sauf qu'il parlait d'avoir des variables contenues telles quelles dans sa classe et non une liste de string, à construire et à garder dans un coin.

    (Bien entendu la methode du hashmap pourrait etre une solution, tout depend de ce que l'auteur veux/voulait faire au juste).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Salut,
    De plus, la méthode avec reflexion ne marche qu'avec les champs, pas avec les variables locales.

    +100 pour la solution à base de Map.

  12. #12
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Citation Envoyé par djo.mos Voir le message
    Salut,
    De plus, la méthode avec reflexion ne marche qu'avec les champs, pas avec les variables locales.

    +100 pour la solution à base de Map.
    Je suis 100% d'accord avec toi ... mais il n'a rien precisé à ce sujet

    (Comme vous essayez de cassez ma belle solution 'humour'
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par djo.mos Voir le message
    +100 pour la solution à base de Map.
    Je pense que si on fait du Java et qu'on ne connait pas les Map.
    Vouloir utiliser la réflexion pour ça est à mon avis dû à un manque d'étude des solutions possibles.

    Et de manière générale, avoir une solution qui utilise la réflexion pour récupérer des champs doit être assez rare et ne doit arriver que pour des cas très particuliers (style génération de chose (texte, code) à partir de classe).

    Je n'ai d'ailleurs jamais eu à utiliser la réflexion dans un code que j'ai écrit pour récupérer les champs.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Par défaut
    les Maps ça convient pas parceque le chiffre tiré au hasard String code1234 , le N (1234) c'est un nombre à 4 chiffres
    et meme si c'etait que 2 chiffres il faudrait que je parcourt toute la Map
    M.get(i), i allant de 0 à 99 et voir quand ça me retourne quelquechose de non null?

    ok wax le probleme c'est que ça fait :





    :ça marche en le mettant static String code123 en dehors du main

    merci à toi wax et les autres

  15. #15
    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
    Citation Envoyé par ____22 Voir le message
    les Maps ça convient pas parceque le chiffre tiré au hasard String code1234 , le N (1234) c'est un nombre à 4 chiffres
    et meme si c'etait que 2 chiffres il faudrait que je parcourt toute la Map
    M.get(i), i allant de 0 à 99 et voir quand ça me retourne quelquechose de non null?
    Non.

    Il suffit d'utiliser la méthode get sur la Map avec en paramètre le code de la valeur que tu veux récupérer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //enregistrement de la valeur dans la map
    Map<String,String> map = new HashMap<String,String>();
    map.put("code123", "salut");
     
     
    //récupération de la valeur dans la map
    int N=123;
    String valeur=map.get("code"+N);
    System.out.println(valeur); // retourne "salut"
    Citation Envoyé par ____22 Voir le message
    l
    ok wax le probleme c'est que ça fait :





    :ça marche en le mettant static String code123 en dehors du main

    merci à toi wax et les autres

    C'est normal, comme on te l'as dit, la méthode de réflexion ne fonctionne qu'avec les variables d'instance de la classe, pas les variables locales.

  16. #16
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par ____22 Voir le message
    :ça marche en le mettant static String code123 en dehors du main
    Désolé mais c'est vraiment super crade


    Tu veux associer une clef à une valeur, et comme cela a été dit les Map sont parfaite pour cela !


    Utiliser la reflection pour cela, c'est comme utiliser un bazooka pour tuer une mouche

    Surtout qu'en plus pour cela tu met tout en static, ce qui implique qu'il n'y aura pas de libération mémoire


    a++

  17. #17
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Comme les autres te disent, je le confirme, tu ne peux pas faire cela pour les var locales. Tu dois donc utiliser la technique de la map, malheureusement je t'ai +- induit en erreur n'ayant pas compris directement qu'il s'agissait de var locales.

    Bonne programmation.

    EDIT : Sinon pour quand meme corriger le truc que tu dois surtout pas utiliser.

    il aurait fallu faire qlq chose du genre et ca aurait fonctionné, mais comme te disent les autres, la map est 2000% plus appropriée
    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
     
     
    class test
    {
    	string code123 = "123";
    	string code123 = "123";
    	string code123 = "123";
    	string code487 = "873";
    ...
    }
     
    ...
     
    main()
    {
     
    	test t = new test();
    	int n = 123;
    	Field f = t.getClass().getDeclaredField("code"+N); // ! si private
    	String valeur = (String) f.get(t);
     
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Conversion string --> nom de variable
    Par Gyslain dans le forum Général Python
    Réponses: 2
    Dernier message: 20/10/2009, 20h10
  2. Réponses: 2
    Dernier message: 23/04/2009, 18h28
  3. Réponses: 9
    Dernier message: 11/03/2009, 14h26
  4. nom de variable dans un string
    Par vincenth_30 dans le forum C++
    Réponses: 7
    Dernier message: 31/07/2007, 18h34
  5. Réponses: 10
    Dernier message: 06/09/2006, 09h01

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