2017-12-24 11 views
1

私は2つの文字列リストlistAlistBを持っています。 listAが長めで、空の文字列を追加することでlistBを同じサイズにしたいと考えています。forループ条件で数式(減算)を使用できないのはなぜですか?

これは動作します:

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に新しい値を追加すると、各ループの中で、あなたがループのための条件がループを停止するfalseであれば見つけることlistBの大きさを再評価するように、大きさは、インクリメントされます。あなたがリストのサイズがlist.addたびにインクリメントリストに

0

を新しい要素を追加しますので、この場合の条件は永遠にtrueになります(「」)のすべてのものを(listB.size(

と呼ばれています) - listB.size())はそれぞれ、リストの新しいサイズを計算する反復処理をパスします。 i。 e listB新しいサイズを取得します。スニペットの差分から

==あなたが行います。オプション1

ListBの

に項目を追加する残りのサイズ。

0

他の回答は、2番目のループが機能しなかった理由を既に説明しています。

私は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, "")); 
} 
関連する問題