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

Java Discussion :

Problème de vector ?


Sujet :

Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut Problème de vector ?
    Bonsoir tout le monde j'apprend je java depuis peu et je code un petit rpg. J'ai réalisé ihm/gameplay/logique. En soit le jeu est déjà fonctionnel mais pour sont évolution je veux évidemment éviter de devoir le recompiler à chaque ajout/maj mineure. Je passe donc par la sérialisation/désérialisation (qui au passage est beaucoup plus simple que le c++ avec boost ! ). Pour ce coter c'est réglé. Maitenant j'ai voulu créer une nouvelle méthode permettant de récupérer les adresses où ce trouve mes objet sérialisé pour par la suite pouvoir les chargé.
    J'ai donc un fichier SpellIndex contenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    src/data/spells/s_01.dat
    src/data/spells/s_02.dat
    src/data/spells/s_03.dat
    Une méthode récupérant les adresses qui renvoie un vecteur de string :
    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
     
    public static Vector<String> getRessource(RessourceType resType) throws IOException 
    	{
    		Vector<String> ressources = new Vector<String>();
     
    		if (resType == RessourceType.SPELL) 
    		{
    			File file = new File("src/data/SpellsIndex");
    			BufferedReader br = new BufferedReader(new FileReader(file));
    			String line = new String();
     
    			while ((line = br.readLine()) != null) 
    			{
    				ressources.addElement(line);
    			}
    			br.close();
    		}
     
    		return ressources;
    	}
    Et dans mon main j'ai mit ceci pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SpellLoader sl = new SpellLoader();
     
    Vector<Spell> spells = new Vector<Spell>();
     
    spells = sl.loadAll(tools.getRessource(RessourceType.SPELL));
     
    for( int i = 0; i < spells.size(); i++ )
    	System.out.println(spells.get(i).name());
    Le problème c'est que j'ai trois sort et sur les trois il ne m'affiche que les deux dernier.
    Je peux ajouter autant de ressources que je souhaite mais malgré tout il n'affichera jamais le premier sort.

    J'ai beau chercher je vois pas d'erreurs :/ je m'y prend surement mal pour chargé les adresses mais comme je ne connais pas trop le Java, je suis un peu perdu sur le coup ^^"

    Votre aide est la bien venu

    Probléme résolue, en debug j'avais modifier une boucle pour qu'elle commence à 1 x)

  2. #2
    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,

    Je ne vois pas trop où est le problème de devoir recompiler en cas d'évolution (ce n'est pas une opération très lourde et compliquée), mais admettons.

    Sinon 2 choses :

    1. File file = new File("src/data/SpellsIndex");Je suppose que tu comptes déployer ton programme, sous forme de jars (tu peux distribuer le jar principal contenant tes classes compilées et un second jar avec tes fichiers), pas sous forme de sources, ou sous forme de pleins de .class. Pour l'accès aux fichiers de ressources, on n'utilise pas File qui permet d'accèder à des fichiers. Il n'y a pas de fichiers dans les jars. Donc avec File, ça ne fonctionnera pas. Pour y accèder, on utilise Class.getResource() ou Class.getResourceAsStream().

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      try(BufferedReader br = new InputStreamReader(LeNomDeTaClassIci.class.getResourceAsStream("/data/SpellsIndex")) {
      	String line = null;
              while ((line = br.readLine()) != null) {
                   ressources.addElement(line);
              }		
      }
      Idem pour chacun des .dat.
    2. Vector est une classe obsolète. Utilise plutôt une List (par exemple ArrayList).


    A noter que pour éviter les problèmes d'index, quand tu n'as pas besoin de traiter d'index dans la boucle, tu peux utiliser un foreach qui simplifie l'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for( Spell spell : spells )
    	System.out.println(spell.name());
    Voire mieux la méthode forEach de List :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    spells.forEach(spell-> System.out.println(spell.name()));
    Ou un stream
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    spells.stream().map(Spell::name).forEach(System.out::println);

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Ou un stream
    Tant qu'on parle de Stream, ton code de lecture sera vachement plus facile avec java 8 aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try(BufferedReader br = new InputStreamReader(LeNomDeTaClassIci.class.getResourceAsStream("/data/SpellsIndex")) {
    	return br.lines().collect(Collectors.toList());		
    }
    Citation Envoyé par Disixlis Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    			String line = new String();
    
    			while ((line = br.readLine()) != null) 
    			{
    				ressources.addElement(line);
    			}
    petites infos pour débutant:
    • inutile d'initialiser une variable à une valeur que tu va immédiatement écraser dans ta boucle.
    • si tu te retrouve à appeler explicitement le constructeur de String dans ton code, tu fais vraisemblablement une erreur car tu n'en a pas besoin. La jvm se charge déjà de les appeler avec les chaines de caractères statiques que tu lui fournis dans le code et pour ce qui est dynamique, c'est presque toujours retourné par des méthodes que tu appelle (Reader, StringBuilder, ...). Le seul cas parfois utilisable est le new String(char[]) quand on construit le char[] dynamiquement. Bref "new String" dans le code -> alerte rouge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String a1 = "aaaa" ; // bien
    String a2 = "aaaa" ; // la jvm va réutiliser la String d'au dessus puisque c'est la même constante
    String a3 = new String("aaaa"); // ça fait le même qu'au dessus mais avec un objet inutile en plus dans la mémoire

  4. #4
    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
    Citation Envoyé par joel.drigo Voir le message
    Je ne vois pas trop où est le problème de devoir recompiler en cas d'évolution (ce n'est pas une opération très lourde et compliquée), mais admettons.
    C'est vrai que s'il a des joueurs non développeurs, c'est bien de pouvoir modifier certains parametrages sans avoir à tout recompiler. Typiquement, la quantité de dommages que font les sorts dans son exemple.

    Citation Envoyé par joel.drigo Voir le message
    Pour y accèder, on utilise Class.getResource() ou Class.getResourceAsStream().
    Pour ma culture personnelle, j'ai remarqué qu'à chaque fois que tu proposes d'utiliser ces méthodes, tu utilises toujours la classe ou elle est utilisée (ici, LeNomDeTaClassIci.class.getResourceAsStream("/data/SpellsIndex")). De mon coté, j'aurais tendance à utiliser Object.class.getResourceAsStream("/data/SpellsIndex") afin de pouvoir copier/coller et de faire la meme chose partout. Connais-tu un avantage/inconvénient à utiliser l'une plutot que l'autre ?

  5. #5
    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
    Citation Envoyé par hwoarang Voir le message
    C'est vrai que s'il a des joueurs non développeurs, c'est bien de pouvoir modifier certains parametrages sans avoir à tout recompiler. Typiquement, la quantité de dommages que font les sorts dans son exemple.
    S'il ne s'agit que de données, je préfère nettement utiliser des fichiers de données plutôt que la serialisation/deserialisation de classes, qui pour moi, ne devrait servir qu'à transmettre entre deux systèmes des instances par un protocole de type "texte". Ensuite, si on veut pouvoir rendre évolutif un programme par l'ajout de programme (donc par des joueurs developpeurs), il y a toujours la solution de type plug-in.

    Citation Envoyé par hwoarang Voir le message
    Pour ma culture personnelle, j'ai remarqué qu'à chaque fois que tu proposes d'utiliser ces méthodes, tu utilises toujours la classe ou elle est utilisée (ici, LeNomDeTaClassIci.class.getResourceAsStream("/data/SpellsIndex")). De mon coté, j'aurais tendance à utiliser Object.class.getResourceAsStream("/data/SpellsIndex") afin de pouvoir copier/coller et de faire la meme chose partout. Connais-tu un avantage/inconvénient à utiliser l'une plutot que l'autre ?
    A ce sujet je te suis. En réalité, je dévellope depuis 10 ans surtout du Eclipse RCP. Pour les ressources de type image, localisation, ou ce genre, qu'on met dans un dossier à part, "relatif" à la racine, j'utilise plutôt l'accès par les méthodes de l'activator, ou par le paramétrage de plug-in (manifest, extensions...), donc sans mention de classe (c'est le framework qui gère). Sinon, j'utilise les ressources pour paramétrer les classes, et là, je préfère les gérer en relatif, par rapport à la classe, pour pouvoir réutiliser dans un autre package/plugin par refactorisation ou copier/coller, sans avoir à me soucier d'adapter le path (surtout que ce n'est pas traité par la refactorisation automatique). Mais c'est vrai que dans l'exemple le chemin est absolu. C'est plus par habitude/reflexe que j'ai indiqué "LeNomDeTaClass".

  6. #6
    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
    Citation Envoyé par joel.drigo Voir le message
    S'il ne s'agit que de données, je préfère nettement utiliser des fichiers de données plutôt que la serialisation/deserialisation de classes, qui pour moi, ne devrait servir qu'à transmettre entre deux systèmes des instances par un protocole de type "texte". Ensuite, si on veut pouvoir rendre évolutif un programme par l'ajout de programme (donc par des joueurs developpeurs), il y a toujours la solution de type plug-in.
    Oui, j'aurais aussi plutot été vers un fichier de config. Mais à la lecture du post initial, j'ai l'impression que c'est le but de la manip. Ceci étant dit, je peux me tromper...

    Citation Envoyé par joel.drigo Voir le message
    A ce sujet je te suis. En réalité, je dévellope depuis 10 ans surtout du Eclipse RCP. Pour les ressources de type image, localisation, ou ce genre, qu'on met dans un dossier à part, "relatif" à la racine, j'utilise plutôt l'accès par les méthodes de l'activator, ou par le paramétrage de plug-in (manifest, extensions...), donc sans mention de classe (c'est le framework qui gère). Sinon, j'utilise les ressources pour paramétrer les classes, et là, je préfère les gérer en relatif, par rapport à la classe, pour pouvoir réutiliser dans un autre package/plugin par refactorisation ou copier/coller, sans avoir à me soucier d'adapter le path (surtout que ce n'est pas traité par la refactorisation automatique). Mais c'est vrai que dans l'exemple le chemin est absolu. C'est plus par habitude/reflexe que j'ai indiqué "LeNomDeTaClass".
    Ok, merci pour l'info.

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Attention car il y a quand même une différence entre LeNomDeTaClassIci.class.getResource() et Object.class.getResource() : le ClassLoader utilisé n'est pas le même.

    Dans une application "standalone" cela n'a pas beaucoup d'importance et cela revient au même.
    Mais si notre code tourne dans une application serveur ou autre, il est possible que Object.class.getResource() ne trouve pas la ressource...

    Donc il est bien préférable d'utiliser une classe qui sera stocké dans le même jar que les ressources.


    a++

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

Discussions similaires

  1. Problème redimensionnement vector
    Par Zacks dans le forum SL & STL
    Réponses: 2
    Dernier message: 19/06/2006, 15h18
  2. [Debutant][Vector]Petit problème de vector
    Par GyZmoO dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 25/05/2006, 10h39
  3. Problème avec vector par référence
    Par vdumont dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/05/2006, 08h25
  4. Problème de vector
    Par jamesleouf dans le forum SL & STL
    Réponses: 13
    Dernier message: 22/03/2006, 22h36
  5. problème class vector
    Par Pe04 dans le forum SL & STL
    Réponses: 2
    Dernier message: 27/02/2006, 10h45

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