2017-12-24 25 views
1

두 개의 문자열 목록, listAlistB이 있습니다. listA은 더 길며 빈 문자열을 추가하여 동일한 크기의 listB을 만들고 싶습니다.for-loop 조건에서 math (빼기)를 사용할 수없는 이유는 무엇입니까?

int diff = listA.size() - listB.size() 
for (int i = 0; i < diff; i++) { 
    listB.add(""); 
} 

을하지만이되지 않습니다 :

이 작동

for (int i = 0; i < (listA.size() - listB.size()); i++) { 
    listB.add(""); 
} 

이 왜입니까?

+9

첫 번째 경우 listB – chrisz

+1

의 크기를 변경하기 때문에 , diff는 루프에 들어가기 전에 한 번 계산되며, 값은 동일하게 유지됩니다. 두 번째 경우에는'(listA.size() - listB.size())'가 반복 될 때마다 다시 계산됩니다. – SU3

답변

9

가변 diff이 상태가 반복 될 때마다 평가하고, 따라서 사용자가 반복 동안 객체를 추가하고 있기 때문에리스트의 크기가 왜 모두 코드 단편은 따라서 변경 될 것이다 번째 예 반면 상수 첫 번째 예 똑같은 일을하지 마십시오.

먼저 루프 조건에 대한 한도를 미리 캐싱하고 반복 할 때마다 다시 평가하지 않는 것이 좋습니다.

+0

'while (listA.size()> listB.size())'루프를 사용하는 것이 더 좋습니다. 의도가 무엇인지 명확하기 때문입니다. –

0

listB에 새 값을 추가하면 크기가 증가하므로 각 루프에서 for 루프는 listB의 크기를 다시 평가하여 조건이 false 인 경우 루프를 중지합니다. 이 경우 조건이 (당신이 목록

0

목록의 크기는

모든 것 (listB.size 호출 될 때마다 시간에는 list.add을 ("") 증가에 새로운 요소를 추가 이제까지 때문에 대한 true 될 것입니다) - listB.size())는 반복을 통과 할 때 목록의 새 크기를 계산합니다. i. e listB 새로운 크기를 얻습니다. 당신의 조각은 diff에서

== 당신이 할 것입니다 옵션 1

listB

에 항목을 추가 할 나머지의 크기입니다.

0

다른 답변은 두 번째 루프가 작동하지 않는 이유에 대해 이미 설명했습니다.

내가 Collections.nCopiesList.addAll를 사용하여 루프를 제거하는 다른 방법을 제안하고 싶습니다 :

if (listA.size() - listB.size() > 0) { 
    listB.addAll(Collections.nCopies(listA.size() - listB.size(), "")); 
} 

또는

int diff = listA.size() - listB.size(); 
if (diff > 0) { 
    listB.addAll(Collections.nCopies(diff, "")); 
}