2012-02-12 7 views
1

いくつかの条件で真を返すHasMapのサブセットのサイズを簡単に見つける方法はありますか?Java HashMapのサブセットを数える

のは、私がこれがあるとしましょう:私はJavaが良く、より速く持っているかどうかを知りたい:

HashMap<Company, Revenue> results; 

そして、私は収入だ企業の数を見つけたいが、10

編集です解決策、for-loop以外。

+0

@ FabianBarneyの答えはあなたに最も一般的な解決策を与えます。逆インデックスを求めており、各キーに複数の値(Revenue)がある可能性があるため、マルチマップデータ構造が必要です。自分で作成するのは難しいことではありませんが、Guavaの実装を利用することで、なぜホイールを再構築しますか? –

答えて

0

パフォーマンスは気になるのですか、それとも答えが必要ですか?シンプルバージョン:

int count = 0; 
for (Revenue r : results.values()) { 
    if (r.equals(10)) { // I'm not sure what your revenue class is, exactly. Add appropriate comparison here. 
    count++ 
    } 
} 

マップは一般的にキーベースなので、バリューベースの操作は一般的に非効率的です。あなたは対照的に、単に変数に数を格納するためにそれらの上にいくつかの操作を行う必要があるとき

+0

アンサーさんありがとう、ちょうど私の質問を更新しました。 –

0

コード

List<Company> comp = new ArrayList<Company>(); 
for(Company cp : results.keySet()){ 
    if(results.get(cp).equals(10)){ 
    comp.add(cp); 
    } 
} 

次の作品を試してみて、リスト内の収納企業の優位性は、会社全体のオブジェクトを利用できるようになります。

0

実際に値をループせずにこれを行う方法はないと思います。検索する値によってキーが設定され、収益オブジェクトのリストを含む値として別のマップを持つことができます。しかし、これは明らかに動的ではなく、かなり醜いです。

1

Guava Multimapを2番目のマップとして使用できます。このマップは、複数の値を1つのキーに関連付けます。したがって、現在の地図を逆転させ、収益をキーとして使用し、複数の企業を関連付けることができます。

その後、すべての企業に特定の収益を簡単に手に入れることができます。

ListMultimap<Revenue, Company> revenue2Companies = ArrayListMultimap.create(); 
Revenue rev = ...; 

List<Company> companies = revenue2Companies.get(rev); 

使用する実装のjavadocを必ず読んでください。キーとして使用されるクラスでは、おそらく適切なequalsメソッドを実装する必要があります。

1

GuavaMultimapおそらく最も簡単な解決策ですが、それは@Fabianバーニーが示唆よりも簡単です...あなたが作る必要がありますならば、これは標準forループよりも唯一の高速である、と述べた

SetMultimap<Revenue, Company> companiesByRevenue = 
    Multimaps.invertFrom(Multimaps.forMap(results), HashMultimap.create()); 
// view results as a Multimap, and then invert the key/value relationship to 
// find all keys associated with each value 
return companiesByRevenue.get(desiredRevenue); // Set<Company> 

異なる収益を持つ複数のクエリ。 1つの特定の収益価値を持つ企業を探す必要がある場合は、単純なforループよりも速いソリューションはありません。

+0

また、@FabianBarney、Multimap docsに投稿したリンクは非常に古いです。リリース3、Guavaはリリース11になりました! (あなたが見たことのないGuavaのユーザガイド/ wikiにリンクしました。) –

+0

ありがとう、私の投稿を更新しました。 –

関連する問題