2

サイズが 20 ~ 40 のアイテムごとに複数のハッシュマップを既に反復処理しているため、if反復処理中に条件を追加するか、単一のget(key)操作を使用するだけでアイテムを見つける方が理にかなっていますか? どちらのアプローチがパフォーマンスを向上させますか。

正確な結果を得るためには、プロファイリングの結果に頼る必要があることはわかっていますが、プロファイリングにあまり詳しくないため、専門家の意見が必要でした。

編集:

これが私のコードです:

    for (HColumn col : lobColumns) {// lobcolumns is a list but I also have hashmap already built containing same elements as this list
        switch (ByteBufferToInt(col.getName())) {

            case .......:
                break;

            case .......:
                break;
            case .......:
                break;
            case .......:
                break;
            case .......:
                break;                  
        }            
        if (ByteBufferToInt(col.getName()).intValue()==currentUserId()){// here is what I'm using as replacement for hashmap `get()`
            .....
        } 
    }

lobcolumnsはリストですが、このリストと同じ要素を含むハッシュマップも既に作成されています。get()このリスト/マップには、いくつかの定数といくつかの変数オブジェクトが含まれています。定数については、効率的なルックアップのためにスイッチケースを使用し、ハッシュマップを使用するかif、すでに反復中に使用するかを決定する必要がある単一の特別な変数アイテムを見つける必要があります。

4

2 に答える 2

5

まあ、見てみましょうという意味です。get演算は、最悪の場合、完全なハッシュ関数で一定時間O(1)または一定時間です。一方、反復は最悪のケースです。事前に呼び出すだけの場合は、すべてを繰り返す必要はありません。O(n)keyget

アップデート

次の行:

for (HColumn col : lobColumns)

あなたのコメントは、これらの値はすべてHashMap既にに保存されているというものでした。マップが次のように定義されている場合:

Map<Integer, HColumn> columns = new HashMap<Integer,HColumn>();  

ステートメントは for ループのif外側に移動し、次のようになります。

HColumn column = columns.get(currentUserId());     
if(null != column)  
{  
     doSomethingWithColumn(column);  // this was the old if block
}   
for(Integer col : columns.keySet())  
{  
    switch(col)  
    {  
       ...  
    }
}

forこれにより、if がループの外側にあるため、一度だけ実行されるようになります。

于 2012-11-05T20:19:35.467 に答える
1

ステートメントを使用するifと、ループを実行する回数だけ比較が行われます。

HashMapハッシュキーを使用して値を維持および取得するためのものであるため、非常に効率的です。

いくつかの不必要な比較を避けるために、get(key)overステートメントを使用することをお勧めします。if

于 2012-11-05T20:26:55.203 に答える