2017-03-21 13 views
1

Map<Object,List<Object>>を反復してList<Object>(値)のオブジェクトがある条件を満たすようなMap.Entryを抽出したいと思います。
私はこれを行うには、2つの方法を見ることができます:
リストを含むマップを線形時間に反復する

1)明らかな方法)は、リストの上にエントリーセットとループ(値を抽出することです。
2)このマップをGuavaのMultiMapに変換し、値をループし、条件が満たされている場合はキーにフラグを立て、マップから実際のListを抽出します。

私は非線形解法であるため、最初の方法を避けたいと思います。これを行うための他のより効率的な方法がありますか?

+1

最初のアプローチは、線形時間ではありません。これはオブジェクトの総数が線形です。これらの2つのソリューションは同等です。 –

+1

なぜ私は1)線形時間でなければならないのか分かりません。また、プロファイリングで特定されたパフォーマンスの問題がありますか、それとも単なる推測ですか? – Axel

+0

最初のアプローチでは、まずすべてのエントリセットを反復処理する必要があります。各反復で、条件をチェックするためにその値を再びループする必要があります。それはネストされたループになります。これは非線形にしませんか? – user2780757

答えて

0

いいえ、それぞれの値を確認する必要がある場合は、すべての値を調べなければなりません。すべての値を調べるには、次のようにする必要があります。

public List<Object> getEntriesThatMeetCondition(Map<Object, List<Object>> input) { 
    List<Map.Entry> output = new ArrayList<>(); 

    Iterator it = input.entrySet().iterator(); 

    while(it.hasNext()) { 
     Map.Entry entry = (Map.Entry) it.next(); 

     List inputList = (List<Object>) entry.getValue(); 

     for(Object object : inputList) { 
      if(meetsCondition(object)) { 
       output.add(entry); 
      } 
     } 
    } 
} 

あなたは各項目を一度通過するという意味で線形です。

関連する問題