Modification de collection d'objets

Fermé
Khatrouch - 29 mars 2015 à 00:13
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 29 mars 2015 à 12:18
Bonjour,
J'ai une arrayliste appelée RList : une collection d'objets List. chaque List a comme attributs:
1) bin_code:long
2)attribute:int
3) value:string
4)liste: arrayliste des couple(un couple est un objet dont ses attributs sont:id de type int et belief de type double )
En premier temps je cherche à vérifier lors du parcours de RLists'il y a une liste qui est incluse dans une autre liste (cette verificatin se fait avec cette condition:
(l.bin_code & l1.bin_code)==l.bin_code && (l.attribute==l1.attribute) )
avec L et L1 deux objets List)
Puis si cette vérification est vérifiée je doit vérifier pour chaque couple d'une liste sil se trouve dans une autre liste avec le mm id si c'est le cas alors il me faut mettre à jour le belief de deuxième couple (le couple existant dans la liste ayant value.length() le plus grand) qui devient la somme de deux beliefs, si non je doit ajouter ce couple dans la deuxiéme liste(la liste ayant value.length() le plus grand)
voilà la fonction que j'ai développé mais elle ne fonctionne pas:

public void update_ridlist()
{ int i=0;
for(List l:this.RList)
{
for(List l1:this.RList)
{
while(l.value.length()<l1.value.length())
{
if((l.bin_code & l1.bin_code)==l.bin_code &&
(l.attribute==l1.attribute) )

{
for(Cpl c:l1.liste)
{
if(c.id==l.liste.get(i).id)
{
c.belief=+l.liste.get(i).belief;

i++;
}
l1.liste.add(l.liste.get(i));
i++;
}
}
}

Est-ce que quelqu'un peut m'aider?? Merci d'avance

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
29 mars 2015 à 00:41
Bonjour,

Un code incomplet ne nous permet pas de t'aider, on ne peut pas comprendre le contexte de ta classe sans son code.

Visiblement tu utilises ta propre classe "List" (et si je comprends bien tu as aussi ta propre classe "arrayliste") ce qui est clairement une mauvaise idée vu qu'en Java l'interface List et la classe ArrayList désignent quelque chose de bien précis qui n'est visiblement pas compatible avec ce que tu as codé.

Donc sans les classe "List", "arrayliste", Cpl, ou autres éléments de code qui nous permettrait de tester, impossible de te dire pourquoi ton code ne fonctionne pas...

Remarque : tu as les balises <code java></code> pour mettre en forme ton code sur le forum.
0
Non je n'utilise pas une classe arrayliste. Je suis entrain de travailler dans la classe RidList qui a un seul attribut: RList de type arryliste: comme j'ai déja mentionné c'une collection des objets List.
La classe Cpl est définit comme suit:
public class Cpl {
  public int id;
     public double belief;
     public String value;

     public Cpl()
     {}
    
   
 }

La classe List :
import java.util.ArrayList;
public class List <List>{ 
  public String value;
  public long bin_code;
        public int attribute;
 public ArrayList<Cpl> liste = new ArrayList<Cpl>(); 
}

La classe RidList:
import java.util.ArrayList;

 public class RidList {
  
  public ArrayList<List> RList = new ArrayList<List>(); 

         public RidList()
        {
      /*remplissage de Rlist est fait */
        }

Voilà leurs organisations, est-ce que vous pouvez m'aider maintenant. Merci d'avance.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
29 mars 2015 à 12:18
Déjà c'est très bizarre d'avoir
class List <List>
ça donne une classe paramétrée par elle même, et après dans le code tu vas avoir une ambiguïté est-ce que tu utilises List comme étant la classe, ou List comme son paramètre ? A priori Java considère que c'est toujours le paramètre, il ne manipule donc jamais la classe. Il faudrait nommer le paramètre autrement et distinguer ce qui est conteneur et contenu :

public class List<E> { // List:conteneur, E:contenu
//...
    public ArrayList<E> liste = new ArrayList<E>(); 

Remarque : puisque ta classe List est paramétrée, il faut lui affecter un paramètre à chaque fois que tu l'utilises, sinon ce sera Object par défaut, alors que ce tu voudrais ce sont plutôt des Cpl

public class RidList {
    public ArrayList<List<Cpl>> RList = new ArrayList<List<Cpl>>();

Mais je ne comprends pas l'intérêt d'utiliser ArrayList ici, pourquoi ne pas reprendre ta classe List, alors qu'apriori elle est faite pour la remplacer ?
public class RidList {
    public List<List<Cpl>> RList = new List<List<Cpl>>();

Remarque : en Java les noms d'attributs ou de méthodes devraient commencer par une minuscule (rList au lieu de RList) et ne pas contenir de underscore (binCode au lieu de bin_code, updateRidlist au lieu de update_ridlist). De plus mettre un attribut public est toujours dangereux, il faudrait le protéger soit en le déclarant private, soit en lui rajoutant le statut final (éventuellement les deux)

private final int id; // à privilégier quand c'est possible
private int id; // ce que tu devrais avoir la plupart du temps
public final int id; // raccourci utile, mais ça ne remplace pas un getteur

D'ailleurs à propos de getteur, tu n'en as pas, ou tu ne les utilises pas, mais ça donne un code assez bizarre où tu as des mélange d'accès par méthodes et d'accès par attributs comme dans
l.liste.get(i).id
on s'attendrait plutôt à avoir un
l.get(i).getId()
avec get(int) une méthode de la classe List qui masque la structure interne en l'ArrayList, la manipulation d'un objet doit se faire par l'appels à ses méthodes, pas aux méthodes de ses membres, c'est dangereux.

Quant à ton besoin, "vérifier lors du parcours de RLists'il y a une liste qui est incluse dans une autre liste" je ne vois pas en quoi ta méthode répond à ce problème, on s'attendrait à avoir une méthode avec un booléen en résultat qui renvoie true ou false si les deux paramètres (qu'il faudrait donc mettre aussi) sont inclus l'un dans l'autre. Mais là ta méthode modifie tes listes (avec des add) et ne renvoie aucun résultat, je ne vois pas comment ça peut faire ce que tu veux.

Enfin, à propos de ton commentaire, "remplissage de Rlist est fait", ce n'est pas le rôle d'un constructeur de se remplir lui même, il doit initialiser les attributs (construire l'ArrayList par exemple), mais l'ajout d'éléments doit se faire grâce aux paramètres qui sont passés au constructeur, pas magiquement avec un constructeur qui renverra toujours la même chose pour tous les objets.
0