이것은 아주 큰 프로젝트에서 처음으로 작업 한 것이므로 최상의 성능을 얻으라는 질문을 받았습니다.최적화 : for 루프를 ListIterator로 바꿉니다.
약 15 개의 요소가있는 목록에 list.get(i)
을 호출하는 약 180 개의 루프가 있기 때문에 for 루프를 ListIterator
으로 바꾸는 대신에 thouhgt를 사용했습니다.
그래서 두 가지 질문이 있습니다.
1) 해당 스 니펫은 동일한가요? 내말은, 그들도 같은 산출물을 산출합니까? 아니라면, ListIterator
것을 어떻게 수정할 수 있습니까? 나는 이런 식으로 뭔가있어 경우 첫 번째 조각이 얼마나
for (int i = 1; i < rides.size(); i++) {
if (rides.get(i).getOP() < d.getFP() && rides.get(i - 1).getOA() > d.getIP() && rides.get(i).getOP() - rides.get(i - 1).getOA() > DP) {
doSomething();
break;
}
}
2) __
ListIterator<Corsa> ridesIterator = rides.listIterator();
while (ridesIterator.hasNext()) {
ridesIterator.next();
Corsa previous = ridesIterator.previous(); //rides.get(i-1)
Corsa current = ridesIterator.next(); //rides.get(i)
if (current.getOP() < d.getFFP() && previous.getOA() > d.getIP() && current.wait(previous) > DP) {
doSomething();
break;
}
}
? (변경 전 및 종료 조건)
for (int i = 0; i < rides.size() - 1; i++) {
if (rides.get(i).getOP() < d.getFP() && rides.get(i + 1).getOA() > d.getIP() && rides.get(i).getOP() - rides.get(i + 1).getOA() > DP) {
doSomething();
break;
}
}
가 나는 ListIterator
을 사용하고 처음이고 나는 지금 그것을 시도 할 수 없기 때문에 내가 부탁 해요!
편집 : 나는 ArrayList에를 사용하지 않는, 그것은 EDIT 2
LinkedList의 기반으로 사용자 정의 목록입니다 : 나는 좀 더 많은 정보를 정기적으로 추가 해요. 일관성없는 데이터를 처리해야하므로 evry 반복에서 내 데이터가 변경되고 캐시 관리가 어려워 캐싱 시스템을 사용할 수 없습니다. 이 루프의 일부를 하나의 큰 루프로 병합 할 수도 없습니다. 다른 방법을 사용하기 때문에 여러 가지 작업을 많이해야하기 때문입니다.
그래서이 특별한 경우를 고수하면서 가장 좋은 징계는 무엇이라고 생각하십니까? ListIterator가 내 사건을 다루는 가장 좋은 방법입니까? for 루프가 0에서 size-1 사이에서 작동하면 어떻게 ListIterator를 사용할 수 있습니까?
(!) 참고 : '놀이기구 .get (i-1)'은 첫 번째 요소에 대해 예외를 던질 것이고 반복자를 사용하는 접근법은 똑같이 할 것입니다. 또한, 반복자를 사용하는 코드는'ridesIterator.next()'와 함께 라인의 마지막 요소에 대한 예외를 던집니다. –
실수로, 두 번째는'rides.get (i-1)'대신'rides.get (i + 1)'을 가져야합니다. Fixed – StepTNT
'rides'가'ArrayList'의 인스턴스라면,'rides.get (i)'는 O (1)에서 끝납니다. 이 경우 변환을 통해 프로그램을 훨씬 빠르게 작성하지 못할 수 있습니다. – reprogrammer