2011-12-08 12 views
5

私はJavaでの機能について疑問に思っていました。私はAを拡張するクラスBとCのオブジェクトを含むArraylist(クラスA)を繰り返したいと思います。このアイデアは、ArrayList内のBクラスのオブジェクトを反復したいだけです。Arraylistを拡張クラスで反復する

どのようにして、以下のコードの短い例のように、長いものがなくても可能ですか?

メインクラス:

 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 { 

} 

編集:非常に多くの人々がこれに答えているので、私はinstanceofの使用を知っています。あなたは、再利用可能なフィルターを作ることができる

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

すべてのリストを繰り返し、リストのすべてのオブジェクトが目的のクラスであるかどうかをチェックする必要があります。あなたは以下の答えですでに述べたように、キーケースの "インスタンス"を見たいかもしれません...しかし、私はコードがあなたのものと似ているのではないかと心配しています(しかし、アプローチの例はより良い/クリーナーです) – Pitelk

+0

それを編集する前の質問は、あなたが求めていたことは明らかではありませんでした。 – JRSofty

答えて

2

:私はあなたがこのようなguava

を使用することができますクラスはB.

+0

答えをくれてありがとう、私はちょうど興味があった、高性能の必要はないが、多分私はそれを一度必要とするだろう。素晴らしい答え! – Hidde

2

となっている、アレイ内のすべてのオブジェクトをループへのより高速な方法をしたいですそのためのクラスは、FileFilterに似ています。 (guavaの使用についてのkorifeyの答えを参照してください)。それ以外には、それを行う既存の機能はありません。さらに、既存の機能はすべて、あなたがやっていることを正確に行う必要があります。Listタイプは、オブジェクトの異なるクラスがどこにあるかを知る方法がないからです。

これを回避するための高性能ソリューションが必要な場合は、別のインスタンス用に個別のリストを保存することを検討することができます。現在のリスト。共通APIを使用して両方の機能(すべてのインスタンスとクラスごとのインスタンス)を提供する複合クラスでこれをラップすることもできます。

+0

これはOPと同じことをしません。フィルタはCインスタンスを受け入れますが、OPはC以外のBインスタンスのみを受け入れます。ただし、OPは再利用可能な述語を使用できます。 –

+0

CはAではなくBを拡張します。なぜフィルターはCを受け入れますか? – korifey

+0

申し訳ありませんが、私の間違い。 CがBを拡張し、OPが元のコードを保持していてinstanceofを使用するのではなくクラスを比較した場合、違いがあります。 –

0

私はJRSoftyと同意します。それはinstanceof演算子を使用して、より良いアイデアだ

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

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

私はその例をinstanceofなしで示しましたが、同じことがありました。 – Hidde

0

あなたは、このような単純なループを書くことができます。しかし、タイプがBではないリストのインスタンスをフィルタアウトするには、追加のコレクションライブラリを統合する必要があります。その操作は標準コレクションAPIによって直接サポートされていないためです。たぶんGuavaまたはLambdaJは、あなたがやりたいフィルタリング操作の種類をサポートしているかもしれませんが、私はまだチェックしていません。

関連する問題