2012-05-10 6 views
3

私はすべて同じオブジェクトタイプのオブジェクトのコレクションを持っています。そのタイプの中で、私がアクセスしたい属性があります - この場合は、カンマ区切りのリストに追加します:オブジェクトのコレクション内の特定の属性のセットを返すJavaデータ構造がありますか?

String sep = ", "; 
List<Item> items = db.findItems(); 

for (Item item : items) 
{ 
    result.append(item.getDescription() + sep); 
} //for 

return result.substring(0, results.length - sep.length()); 

私は直接のすべてのオブジェクトからその属性にアクセスすることができれば、それはいいだろう私はGoogleのグアバのジョイナー関数を呼び出すことができるようにコレクション:

return Joiner.on(", ").join(/*Description attribute collection here*/); 

私は考えている構造の種類は、各列が属性を表し2D配列のようなもので、各行はオブジェクトを表し、私がしたいですオブジェクトを返す特定の行または属性のコレクションを返す特定の列(属性)を呼び出すことができるmすべてのオブジェクト。

Javaや良いサードパーティは、このようなデータ構造を持っていますか、自分で作成する必要がありますか?

乾杯、

アレクセイブルー。

答えて

5

Googleのグアバを最大限に使ってみませんか?ラムダ式と方法とJDK 8にすぐに来

Joiner.on(",").join(Collections2.transform(items, new Function<Item, String>() { 
    public String apply(Item input) { 
     return item.getDescription(); 
    } 
})); 
+0

戻り値の型が異なるかどうか(この場合String) –

+0

あなたは正しい、今修正;)、thx! –

+0

ありがとうHieryと@andersoj :)ファンキーな見た目のコードですが、うまくいきます。 –

2

内部のIterableサブクラスを作成してコレクション内の各オブジェクトに到達し、正しい属性を出力できます。 @ Hieryの反応を見ると、彼はコードに素早くアクセスできます...

0

愚かですが、私はItem.toString()を選択します。あなたが参加(マップ)することができるようにマップは存在しませんか?

+0

私は結合関数がマップを取るとは思わない、それは私が考えるコレクションまたはiterableをとります。 –

2

は、あなたがあなたもリンクで提供JDK 8プレビューを使用してやっていることに応じて、

List<Jedi> jedis = asList(new Jedi("Obiwan",80), new Jedi("Luke", 35)); 
List<String> jediNames = jedis.map(Jedi::getName).into(new ArrayList<>()); //with metdod ref 
Iterable<Integer> jediAges = jedis.map(j -> j.getAge()); //with lambdas 

を参照します。

また、ライブラリLambdajは、これを行う手段を提供します。

+0

Cのような素晴らしい、私はJDK 6からアップグレードするためにいくつかの上位アップを最初に説得する必要があるだろうが、私はそれを行うことができると確信している^ ^そのedalorzoのための乾杯、間違いなくJava 8を見に行く –

+0

@AlexeiBlue良い運を説得する:-)その間に、あなたは[State of Lambda](http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html)そこではBrian Goetzがどのように動作するか説明しています。プレビューにはまだいくつかの機能が欠けていますが、かなり機能的です。プロダクション環境ではありませんが、これは評価目的であることは明らかです;-) –

関連する問題