2017-09-17 9 views
0

(申し訳ありませんが、私は間違っているスタック交換にこの質問を置く場合、この質問は、どこか別の場所に行く必要がある場合、私は...それを再投稿します。注)対forループ入れ子テクノロジー会社で初めてのインターンシップを始めたばかりで、コードのパフォーマンスやコーディングの実践について尋ねたいと思っていました。上級開発者がコードを書いていますが、パフォーマンスに関しては私には当てはまらないようですが、経験がないか、それが彼のものかどうかはわかりません。 パフォーマンス/ readibility:</p> <p>I:HashMapの

は、ここで私が見ているコードです:

// Given the following: 
List<TypeA> aList = (...) 
List<TypeB> bList = (...) 

for(TypeA obj : aList) { 
    boolean found = false; 

    for(TypeB obj2 : bList) { 
     if(obj.name.equals(obj2.name) { 
      found = true; 
      break; 
     } 
    } 

    if(!found) { 
     obj.doSomething(); 
     someOtherList.add(obj); 
    } 
} 

私の考えは、forループネストされたOは、(N^2)コードがやろうとしているもののため、かなり非効率的であるということです。このようなことをした方がよいでしょうか? (また、私はその場でこれを入力するよ、構文エラーを気にしないでください;)):

// Given the following: 
List<TypeA> aList = (...) 
List<TypeB> bList = (...) 

Map<TypeB, String> bListToName = new HashMap<>() 
bList.forEach(obj -> bListToName.put(obj, obj.name)); 

for(TypeA obj : aList) { 
    if(bListToName.get(obj.name) == null) { 
     obj.doSomething(); 
     someOtherList.add(obj); 
    } 
} 

私の推論ではなく、forループのネストされたの、私は2つのO(n)のループを使用することです適切なマージンでパフォーマンスを改善する必要があります。特に、当社のa/bListsが十分に大きいか、十分に頻繁に使用されている場合は特にそうです。

洞察や考えがあれば、大変感謝します。

答えて

3

あなたが示唆したように、サイズは要因です。ハッシュマップを構築することは、追加のメモリを割り当てることを意味し、少数の比較で保存された時間を上回る可能性があります。

私はあなたの理論を証明できる結果にするために時間のテストをすることに慣れていることをお勧めします。ピアレビューの際にそのような変更を正当化するには、これを行う必要があります。

それ以外では、私が指摘したいのは、あなたが提案しているものが半分の尺度であることです。コードが本当に重要なのであれば、まずそれをMapとして構造化するのが理にかなっています。

関連する問題