ArrayList d'objets
Littlecalpico
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
J'ai crée une class KeyValuePair de cette manière :
public class KeyValuePair extends Object {
public String nom;
public int valeur; }
J'ai aussi un fichier texte qui donne ligne par ligne ce ceci :
cerise
pomme
poire ... la longueur de la liste est variable selon l'utilisateur.
Ce que je veux faire c'est créer une ArrayList composées d'objets myFruit de type KeyValuePair tel que quand je fais myFruit.nom je récupère cerise pour le premier, pomme pour le deuxième et myFruit.valeur retourne un nombre aléatoire.
Je sais générer les nombres aléatoires (je me concentre sur .nom pour l'instant) et lire le fichier texte ligne par ligne.
Mon code ressemble à ça :
public ArrayList<KeyValuePair> GetFruit() throws IOException {
KeyValuePair myFruit = new KeyValuePair();
ReadFile file = new ReadFile(file_name);
String[] Lignes = file.OpenFile();
ArrayList<KeyValuePair> array= new ArrayList<KeyValuePair>();
for (int i=0; i < Lignes.length; i++) {
String mot= Lignes[i]
myAttribute.category = mot;
array.add(myFruit);
}
}
Mon problème est que je ne sais pas comment créer l'ArrayList, est ce que je dois créer plusieurs objets au lieu de ne créer que un seul objet myFruit ? Je pensais que la boucle permettait de stocker la nouvelle valeur de catégorie pour chaque i mais en fait quand je fais System.out.println(array.get(0).nom), je récupère déjà toutes les catégories!
J'espère que quelqu'un pourra m'aider !
Merci :)
J'ai crée une class KeyValuePair de cette manière :
public class KeyValuePair extends Object {
public String nom;
public int valeur; }
J'ai aussi un fichier texte qui donne ligne par ligne ce ceci :
cerise
pomme
poire ... la longueur de la liste est variable selon l'utilisateur.
Ce que je veux faire c'est créer une ArrayList composées d'objets myFruit de type KeyValuePair tel que quand je fais myFruit.nom je récupère cerise pour le premier, pomme pour le deuxième et myFruit.valeur retourne un nombre aléatoire.
Je sais générer les nombres aléatoires (je me concentre sur .nom pour l'instant) et lire le fichier texte ligne par ligne.
Mon code ressemble à ça :
public ArrayList<KeyValuePair> GetFruit() throws IOException {
KeyValuePair myFruit = new KeyValuePair();
ReadFile file = new ReadFile(file_name);
String[] Lignes = file.OpenFile();
ArrayList<KeyValuePair> array= new ArrayList<KeyValuePair>();
for (int i=0; i < Lignes.length; i++) {
String mot= Lignes[i]
myAttribute.category = mot;
array.add(myFruit);
}
}
Mon problème est que je ne sais pas comment créer l'ArrayList, est ce que je dois créer plusieurs objets au lieu de ne créer que un seul objet myFruit ? Je pensais que la boucle permettait de stocker la nouvelle valeur de catégorie pour chaque i mais en fait quand je fais System.out.println(array.get(0).nom), je récupère déjà toutes les catégories!
J'espère que quelqu'un pourra m'aider !
Merci :)
A voir également:
- ArrayList d'objets
- Site pour vendre des objets d'occasion - Guide
- Ryanair objets interdits - Guide
- Les objets du net avis ✓ - Forum Consommation & Internet
- Site laboutiquedunet fiable ? ✓ - Forum Consommation & Internet
- Vous ne pouvez pas déplacer des objets en dehors de la feuille - Forum Photoshop
2 réponses
Bonjour,
Dans la classe java.nio.Files tu as déjà une méthode pour lire un fichier ligne par ligne et renvoyer une liste.
public static List<String> readAllLines(Path path, Charset cs) throws IOException
Dans la classe java.nio.Files tu as déjà une méthode pour lire un fichier ligne par ligne et renvoyer une liste.
public static List<String> readAllLines(Path path, Charset cs) throws IOException
Je sais lire ligne par ligne en fait, je n'arrive juste pas à créer l'arraylist d'objets :(
C'est quand même dommage d'avoir codé toi même ta classe ReadFile et sa méthode OpenFile alors qu'il existait déjà une méthode standard dans l'API pour le faire...
Sinon pour ton problème, effectivement il faut créer un nouvel objet à chaque fois, parce que si à chaque ajout dans ta liste tu mets toujours le même objet, alors une modification de n'importe quel objet de la liste va tous les modifier puisque c'est le même !
Remarque : évites d'avoir des attributs public dans ta classe KeyValuePair, il vaut mieux faire des accesseurs public pour manipuler les attributs privés. Ou alors il faudrait que les attributs public soit également final, ce qui garantirait qu'ils ne soient jamais modifiés.
De plus tu aurais pu paramétriser ta classe KeyValuePair pour avoir n'importe quel type comme clé et comme valeur plutôt que d'imposer String pour la clé et un nombre pour la valeur. Ça t'aurais permis de réutiliser ton code, ce qui est l'un des grands principes de la programmation objet.
Une dernière remarque pour la route : ArrayList c'est une implémentation, mais il vaut mieux utiliser l'interface qui se cache derrière (c'est à dire List) afin de cacher l'implémentation utilisé, seules les fonctionnalités de la List nous intéresse...
Sinon pour ton problème, effectivement il faut créer un nouvel objet à chaque fois, parce que si à chaque ajout dans ta liste tu mets toujours le même objet, alors une modification de n'importe quel objet de la liste va tous les modifier puisque c'est le même !
Remarque : évites d'avoir des attributs public dans ta classe KeyValuePair, il vaut mieux faire des accesseurs public pour manipuler les attributs privés. Ou alors il faudrait que les attributs public soit également final, ce qui garantirait qu'ils ne soient jamais modifiés.
De plus tu aurais pu paramétriser ta classe KeyValuePair pour avoir n'importe quel type comme clé et comme valeur plutôt que d'imposer String pour la clé et un nombre pour la valeur. Ça t'aurais permis de réutiliser ton code, ce qui est l'un des grands principes de la programmation objet.
Une dernière remarque pour la route : ArrayList c'est une implémentation, mais il vaut mieux utiliser l'interface qui se cache derrière (c'est à dire List) afin de cacher l'implémentation utilisé, seules les fonctionnalités de la List nous intéresse...
public class Pair<K,V> { private final K key; private final V value; public Pair(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } public V getValue() { return value; } } public List<Pair<String,Double>> getFruit() throws IOException { ReadFile file = new ReadFile(fileName); String[] lines = file.openFile(); List<Pair<String,Double>> list = new ArrayList<Pair<String,Double>>(lines.length); for (String line : lines) list.add(new Pair<String,Double>(line, Math.random()); return list; }