Extraction des éléments commun

Fermé
khatrouch - 21 avril 2015 à 16:14
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 21 avril 2015 à 20:04
Bonjour,
J'ai une classe Cpl définit comme suit:
public class Cpl {
public int id;
public double belief;
}

j'ai la classe List définit comme suit :

public class List
{
public String value;
public long bin_code;
public int attribute;
public ArrayList<Cpl> liste = new ArrayList<Cpl>();
}

Puis je définit une autre classe:
Public class VerifList
{
public ArrayList<List> al = new ArrayList<List>();
public ArrayList<Cpl> cp = new ArrayList<Cpl>();
}
Je cherche à extraire les couples (objets de classe Cpl) qui se trouvent simultanément dans toutes les listes stockés dans l'arraylist al (c'est à dire ayant le même attribut id) et par la suite les stocker dans L'arrylist cp.
Par exemple on a un arrayliste al qui contient 3 listes avec:(ici je précise uniquement les couples)
L1:(1,0.5) (3,0.6) (2,0.4)
L2:(2,0.7)(3,0.8)
L3: (2,0.6)
Donc on va extraire uniquement un nouveau couple c ayant le meme id=2
et le produit des belief=0.4*0.7*0.6 =0.168=> c(2,0.168)
Comment je peux élaborer une fonction qui permet d'obtenir ce résultat?







1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
21 avril 2015 à 17:58
Bonjour,

ArrayList a une méthode retainAll qui te permet de ne garder que ce qui est commun. Il faudrait que tu l'applique sur tes id pour savoir lesquels garder et dans un second temps récupérer les belief correspondant.
0
Merci pour votre aide, mais est ce que vous pouvez me préciser comment j'utilise cette méthode puisque je n'arrive pas à comprendre ses paramètres :(Collection<>c)?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > khatrouch
21 avril 2015 à 18:44
C'est parce que la méthode retainAll ne s'applique pas que aux ArrayList mais à toutes les Collections de Java.

On a donc d'une part une interface Collection<E> qui définit la méthode retainAll(Collection<?>) et d'autre part la classe ArrayList<E> qui implémente Collection<E>. Mais dans ton cas particulier tu peux considérer que toutes les collections que tu manipuleras sont des ArrayList.

Donc si tu as ArrayList id1, et ArrayList id2, tu peux faire id1.retainAll(id2); ce qui va enlever de id1 tout ce qui n'est pas dans id2 (on ne conserve donc que ce qui est commun), il reste plus qu'à recommencer avec id3...
0
En utilisant la méthode retainAll il ne reste rien dans les 3 arraylist L1,L2 et L3: je crois qu'il compare ou vérife tous les attributs du couple id et belief. Alors comment je précise qu'il faut se limiter à l'attribut id?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
21 avril 2015 à 20:04
Ce que je disais tout à l'heure ce n'était pas d'utiliser la méthode sur tous tes couples, mais de l'appliquer uniquement sur les id.

Exemple (de tête, il faudrait vérifier)

public static ArrayList<Integer> extractIds(ArrayList<Cpl> cpls) {
    ArrayList<Integer> ids = new ArrayList<Integer>(cpls.size());
    for (Cpl cpl : cpls)
        ids.add(cpl.id);
    return ids;
}

public static void fill(ArrayList<Cpl> toFill, ArrayList<Integer> ids, ArrayList<Cpl> cpls) {
    for (Cpl cpl : cpls)
        if (ids.contains(cpl.id))
            toFill.add(cpl);
}

ArrayList<Cpl> L1,L2,L3;
ArrayList<Integer> ids = extractIds(L1),;
ids.retainAll(extractIds(L2));
ids.retainAll(extractIds(L3));
System.out.println(ids); // les ids en commun aux trois listes
ArrayList<Cpl> L123 = new ArrayList<Cpl>(ids.size*3);
fill(L123, ids, L1);
fill(L123, ids, L2);
fill(L123, ids, L3);
System.out.println(L123); // les couples en commun aux trois listes
0