2012-04-23 2 views
3

Javaには、コンパイラを使用してリスト内の特定のオブジェクトをその変数の1つで見つけるC++標準ライブラリのリストに似たものがありますか?Javaには、変数値でオブジェクトを見つけるためのC++標準ライブラリリストコンパレータに類似したものがありますか?

たとえば、変数比較をチェックして特定のオブジェクトを探すArrayListをループする代わりに、特定のインスタンスを見つけるためにコンパレータオブジェクトを使用する方法はありますか?

(注:。。私は関与HashMapを持つことなく、リストの機能が必要なことは、2つの別々のリストを作成してハッシュマップを使用しない)このような

何かを、しかしためJavaの:

#include <algorithm> 

using namespace std; 

class Cperson  
{  
    string lastname, firstname, address, city;  
    int zipcode;  
    char state[3];  
    // this works for the last name  
    friend bool operator==(const Cperson& left, const Cperson& right);  
    friend bool firstEqualTo(const Cperson& left, const Cperson& right);  
}; 

bool operator==(const Cperson& left, const Cperson& right)  
{  
    return left.lastname == right.lastname;  
} 

bool firstEqualTo(const Cperson& left, const Cperson& right)  
{  
    return left.firstname == right.firstname;  
}  

今、私たちは他のフィールドを無視して、ファーストネームフィールド上の私たちのpersonlistを検索することができます。

vector<Cperson> personlist;  
// fill personlist somehow 

Cperson searchFor; // should contain the firstname we want to find  
vector<Cperson>::iterator fperson; 
fperson= std::find(personlist.begin(),  
        personlist.end(), 
        searchFor,  
        firstEqualTo); 
+0

またはこれ:http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection – duffymo

+0

特に繰り返しを実行しないでくださいか? – arootbeer

+0

はい、高レベルの反復は、ほとんどすべてのインスタンスであらかじめプログラムされた低レベル検索よりも遅いです。私はちょうどJavaがこれに使用できる何らかのコンパレータを持っていないとは信じられません。つまり、並べ替えのためのコンパレータはありますが、検索のためのコンパレータはありません。 – Lokiare

答えて

3

は、Googleグアバを使用することができた場合は、その質問を見て、その答えを持っています: Filtering on List based on one property with guava

更新

は、Googleが好きではないので、それらのライブラリを使用したくない、しようとした場合ApacheのコモンズコレクションCollectionUtils

List<Person> filteredList = new ArrayList<Person>(allPersons); 
CollectionUtils.filter(filteredList, new Predicate() { 
    boolean evaluate(Object object) { 
    //do whatever you want 
    } 
}); 

欠点は、コモンズのコレクション自体がジェネリックを使用していないということです。コモンズコレクション3の汎用portがあります。しかし、1。

+0

違法なプライバシー侵害のために、すべてのソフトウェアが使用する選択肢がある場合は、私はGoogle製品を使用しないことをおすすめします。 – Lokiare

+0

@ JamesHollowayそれは彼らのソフトウェア製品に当てはまりますが、私はそれらの低レベルライブラリがそれをするのか疑問です。それでもやはり幾分政治的な選択ですが、Apacheのコモンズのコレクションを試してみてください(私は私の答えを更新します)。 – Thomas

+0

どこからコレクションをダウンロードできますか?あなたが持っているリンクはそのドキュメントに行きます。 – Lokiare

0

私はJavaのセット(see documentationを信じて)は、C++ STLバージョンとほぼ並行です。 equals演算子をオーバーライドして、カスタム比較を設定することができます。

セットを指定すると、mySet.contains(o)を呼び出して、セットに指定されたオブジェクトが含まれているかどうかを確認できます。

あなたの人を表すJavaクラスを作成し、Personオブジェクトのセットをセットに格納し、equalsメンバ関数をオーバーライドして姓と名を比較し、どちらも同じだった。あなたはあなたのセットに特定の「人」が含まれているかどうかを確認できます。

equalsを上書きする場合は、hashCodeも上書きすることをお勧めします。

+0

セットを使うと、検索パラメータを 'contains(...)'メソッドに渡す必要があります(とにかく 'get(...)'メソッドはありません)、 'equals(...)'はそのパラメータ(本当に 'equals(...) 'の契約を破る可能性が高い)に対してtrueを返さなければなりません。 – Thomas

+0

どうすれば元に戻すことができ、元の比較作業もできますか? "name"という変数を持つオブジェクトのリストを検索したいのですが、forループとcontentEquals()の代わりに最適化された検索が必要です。 – Lokiare

+0

私の間違い - 私の答えは、あなたには平等のための1つのテストしかないという考えに基づいていました。私はこれが実際には適用されないと思います、なぜならあなたは本当に要素ごとに "テスト"を実行しようとしているからです。ごめんなさい! – aardvarkk

1

具体的にはjava.lang.Comparableの実装をいつでも追加できます。

0

あなたはリストには、特定のオブジェクトが含まれているかどうか、チェックするために

list.contains (o); 

を使用することができます。

述語をチェックするには、簡単な組み込みメソッドがありません。しかし、あなたのC++のセットアップよりも簡単なようだ:

for (Person p: persons) { 
    if (p.firstname.equals ("John")) { 
    doSomethingWith (p); 
    // if you only want to handle one case, the first John: 
    break; 
    } 
} 

「ジョン」 - コレクションを作成するには:

List <Person> johns = ArrayList <Person>(); 
for (Person p: persons) { 
    if (p.firstname.equals ("John")) { 
    johns.add (p); 
    } 
} 
+0

これは特定のコンパレータを必要とせず、オブジェクトを取得しません。 –

+0

これは、代替案が見つからなかった場合のやり方ですが、これを実行するとリスト全体が反復されますが、これは遅いです。 ApacheのCollectionUtilsを使用する方が効率的です。 – Lokiare

+0

@JamesHolloway:ループを壊したい場合は、例1に示すように 'break'を使います。私は今find、filter、takeWhile、map、foreachなどのコレクションをスケーリングするのに慣れています。コレクションを使用し、Javaから呼び出すことができますが、それは慣用的なJavaコードではありません。 –

関連する問題