2017-03-17 9 views
1

2つ目のオブジェクトに2つ目のオブジェクトに関連するフィールドがあり、最初のオブジェクトを配置したいオブジェクトが2つあります。一般的に2つの大きなarraylistsを利用するネストされたforループを高速化する

public ArrayList<object1> updateAccountWithGSAM(ArrayList<object1> o1, ArrayList<object2> o2) { 
    ArrayList<object1> accs = new ArrayList<object1>(); 

    for (object1 acc : o1) { 
     ArrayList<String> o2s= new ArrayList<String>(); 
     for (object2 g : o2) { 
      if (g.getfield() != null) { 
       if (acc.getId().equals(g.getobject1())) { 
        o2s.add(g.getCode()); 
       } 
      } 

     } 
     acc.setGSAM_code(o2s); 
     accs.add(acc); 
    } 


    return accs; 

} 

データが少ない場合には、これは正常に動作しますが、データセットが(obj1と2がPRODで各サイズに500,000ある)大取得するとき、これは問題に遭遇しました。

これを高速化するために私ができる最適化や、私が達成しようとしているループのネストされた代替方法はありませんか?

+0

? Java 8の場合、ストリームを試してください – Pons

+0

そのIDをキーとして2つのマップにそのデータを入れることができます。 n回2ループを保存します。 – GhostCat

+0

私はjava 8を使っていますが、ストリームponsにあまり慣れていないので、これは2つのリストの間でフィルタリングするための有効なオプションですか? –

答えて

1

私は、コードをコンパイルしていないが、このような何か作業をする必要があります:あなたが使用しているのjavaのバージョン

public ArrayList<object1> updateAccountWithGSAM(ArrayList<object1> o1, ArrayList<object2> o2) { 
    HashMap<String, ArrayList<String>> reverseMap = new HashMap<String, ArrayList<String>>() 
    for (object2 g : o2) { 
     if (g.getfield() != null) { 
      ArrayList<String> accs1 = reverseMap.get(g.getobject1()); 
      if(accs1 == null) { 
       accs1 = new ArrayList<String>() 
       reverseMap.put(g.getobject1(), acc1) 
      } 
      accs1.add(o2s); 
     } 
    } 
    ArrayList<object1> accs = new ArrayList<object1>(); 
    for (object1 acc : o1) { 
     ArrayList<String> o2s= new ArrayList<String>(); 
     if(reverseMap.get(acc.getCode()) != null) { 
      acc.setGSAM_code(o2s); 
      accs.add(acc); 
     } 
    } 

    return accs; 
} 
+0

これは、私の最初の最適化の試みでもあります(サイズが他のマップタイプをより魅力的にするかもしれません)。これは、o1のアイテムごとにo2よりもコストのかかる検索を行う必要を減らします。 –

+0

haha​​私はghostcatからの提案に基づいてこれとほぼ同じようなものを書いてしまいました。魅力的な作品! –

関連する問題