5 votes

Itération dans une liste de tableaux avec des classes étendues

Je me suis interrogé sur une fonction en Java, qui, je l'espère, existe. Je veux itérer à travers une ArrayList (disons de classe A), qui contient des objets de classe B et C qui tous deux étendent A. L'idée, c'est que je veux seulement itérer à travers (par exemple) les objets de la classe B dans l'ArrayList.

Comment est-ce possible, comme l'exemple court dans le code ci-dessous, et sans l'exemple long ?

La classe principale :

     import java.util.*;

public class Test {

    public static void main(String[] args) {
        new Test ();
    }

    Test() {
        ArrayList<A> a = new ArrayList<A> ();
        a.add (new B ());
        a.add (new C ());
        a.add (new C ());
        a.add (new B ());
        a.add (new C ());
        for (A aObject : a) { // this works, I want it shorter
            if (aObject instanceof B) {
                B b = (B) aObject;
                System.out.println (b.hi);
            }
        }
        for (B b : a) // like this?
            System.out.println (b.hi);
    }
}

A :

public class A {

}

B :

public class B extends A {
    String hi = "hi";
}

C :

public class C extends A {

}

EDIT : Parce que beaucoup de personnes répondent à cette question : Je connais l'utilisation de instanceof. Je veux un moyen plus rapide de parcourir en boucle tous les objets du tableau, dont la classe est B.

2voto

korifey Points 3289

Vous pouvez utiliser goyave

Comme ça :

for (B b: Iterables.filter(a, B.class)) {
 System.out.println (b.hi);
}

2voto

ziesemer Points 15594

Vous pourriez créer une classe de filtre réutilisable, similaire à FileFilter . (Voir la réponse de korifey pour l'utilisation de guava.) A part cela, non, il n'y a pas de fonctionnalité existante pour le faire. De plus, toute fonctionnalité existante devrait faire exactement ce que vous faites de toute façon, puisque la fonction List Les types n'ont aucun moyen de savoir où se trouvent les différentes classes d'objets dans la liste. (Il devrait également itérer sur elles pour les trouver).

Si vous avez besoin d'une solution très performante, vous pouvez envisager de stocker des listes distinctes pour vos différentes instances, en remplacement ou en complément de votre liste actuelle. Vous pourriez même l'intégrer dans une classe composite qui offrirait les deux fonctionnalités (toutes les instances et les instances par classe) via une API commune.

0voto

Augustus Thoo Points 377

Je suis d'accord avec JRSofty.

for (A aObject : a) {
    if (aObject instanceof B) { // <-- This is as short I can make it
        B b = (B) aObject;
        System.out.println (b.hi);
    }
}

0voto

Óscar López Points 97105

Vous pouvez écrire une boucle plus simple comme celle-ci :

for (A aObject : a)
    if (aObject instanceof B)
        System.out.println(((B) aObject).hi);

Il est préférable d'utiliser le instanceof opérateur. Mais pour filtrer les instances de la liste qui ne sont pas de type B vous devrez intégrer une bibliothèque de collections supplémentaire, car cette opération n'est pas prise en charge directement par l'API Collections standard. Peut-être Goyave o LambdaJ ont un support pour le type d'opération de filtrage que vous voulez faire, je n'ai pas encore vérifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X