2011-12-08 16 views
5

Me he estado preguntando acerca de una función en Java, que espero que exista. Quiero iterar a través de un Arraylist (digamos de clase A), que contiene objetos de clase B y C que se extienden a A. La idea, solo quiero iterar (por ejemplo) los objetos de la clase B en ArrayList.Iterando a través del Arraylist con clases ampliadas

¿Cómo es posible, como el ejemplo corto en el siguiente código, y sin el largo?

La clase principal:

 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 { 

} 

EDITAR: Porque muchas personas responden esto: sé del uso de instanceof. Quiero una manera más rápida para recorrer todos los objetos de la matriz, de la que es la clase B.

+0

Tiene que recorrer en iteración toda la lista y para cada objeto de la lista para comprobar si pertenece a la clase que desea. Es posible que desee buscar en la clave "instancia de" como ya se indicó en una respuesta a continuación ... pero me temo que el código será similar al que tiene (pero la instancia de enfoque es mejor/más limpia) – Pitelk

+0

pregunta antes de editar no era claro en cuanto a lo que estabas pidiendo. – JRSofty

Respuesta

2

usted podría hacer un filtro reutilizable clase para él, similar a FileFilter. (Vea la respuesta de korifey para el uso de guayaba.) Aparte de eso, no, no hay ninguna funcionalidad existente para hacerlo. Además, cualquier funcionalidad existente tendría que hacer exactamente lo que está haciendo de todos modos, ya que los tipos List no tienen forma de saber dónde están las diferentes clases de objetos en la lista. (Tendría que iterar sobre ellos también para encontrarlos.)

Si necesita una solución de alto rendimiento al respecto, podría considerar almacenar listas separadas para sus instancias separadas, ya sea en reemplazo o además de su lista actual. Incluso podría incluir esto en una clase compuesta que ofrezca ambas funcionalidades (todas las instancias e instancias por clase) a través de una API común.

+0

Gracias por la respuesta, yo era sólo curiosidad, sin necesidad de un alto rendimiento, pero tal vez una vez que se van a necesitar. ¡Gran respuesta! – Hidde

2

Usted puede utilizar guava

De esta manera:

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

Esto no hace lo mismo que el OP: el filtro acepta instancias C, mientras que el OP solo acepta instancias B que no son C. Sin embargo, el OP podría usar un Predicado reutilizable. –

+0

C extiende A, no B. ¿Por qué el filtro acepta C? – korifey

+0

Lo siento, mi error. Si C extendiera B, y si el OP hubiera conservado su código original donde comparó clases en lugar de usar instanceof, entonces habría una diferencia. –

0

Estoy de acuerdo con 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); 
    } 
} 
+0

Ya mostré ese ejemplo, sin la instancia de, pero la misma cosa. – Hidde

0

Se puede escribir un bucle simple como esto:

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

Es una mejor idea de utilizar el operador instanceof. Pero para filtrar las instancias de la lista que no son del tipo B, debe integrar una biblioteca de colecciones adicional, ya que esa operación no es compatible directamente con la API de colecciones estándar. Tal vez Guava o LambdaJ tienen soporte para el tipo de operación de filtrado que desea hacer, aún no lo he comprobado.

Cuestiones relacionadas