ArrayList d'objets

Fermé
Littlecalpico Messages postés 2 Date d'inscription vendredi 13 juin 2014 Statut Membre Dernière intervention 13 juin 2014 - Modifié par Littlecalpico le 13/06/2014 à 17:39
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 13 juin 2014 à 19:15
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 :)

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
13 juin 2014 à 18:35
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
0
Littlecalpico Messages postés 2 Date d'inscription vendredi 13 juin 2014 Statut Membre Dernière intervention 13 juin 2014
13 juin 2014 à 18:37
Je sais lire ligne par ligne en fait, je n'arrive juste pas à créer l'arraylist d'objets :(
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
13 juin 2014 à 19:15
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...

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;
} 
0