2017-03-17 1 views
1

두 번째 필드에 첫 번째 필드를 채우려는 관련 필드가있는 객체의 arraylists가 두 개 있습니다. 데이터가 작은 경우 일반적으로두 개의 큰 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 약 50 만 크기 자극에 각각이다) 얻을 때이 문제가 발생.

속도를 높이기 위해 내가 할 수있는 최적화가 무엇인지, 또는 달성하려는 루프의 중첩 루프 대신 사용할 수있는 대안이 있는지 잘 모르십니까?

+0

? Java 8의 경우 스트림을 시도하십시오 – Pons

+0

해당 ID를 키로 사용하여 해당 데이터를 두 개의 맵에 넣을 수 있습니다. n 회 2 루핑을 저장합니다. – GhostCat

+0

자바 8을 사용하고 있습니다.하지만 스트림 폰에 익숙하지 않은 경우이 두 목록 간의 필터링에 유효한 옵션입니까? –

답변

1

나는 코드를 컴파일하지 않은 있지만,이 같은 작동합니다 : 당신이 사용하는 자바의 버전

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

하하 나는 고스트캣의 제안에 근거하여 거의 똑같은 것을 썼다. 매력처럼 작동합니다! –

관련 문제