2012-02-19 9 views
2

http://introcs.cs.princeton.edu/java/14array/CouponCollector.java.html理解ブール!配列[i]は、javaの

オーケーで、私が理解からして、それが偽であるデフォルトブール値、が割り当てられています。しかし、falseのnegatronがtrue(!found[val])なので、ブール値のすべてがデフォルト(false)に設定されていると、この条件がどのように機能するのでしょうか?前もって感謝します。

+1

あなた自身の質問に答えられませんでしたか? – BrokenGlass

+0

あなたがそう言うなら、私は私が上のやり方を思いついたのを見たと思う。例えば、!found [val]には、(デフォルト値のために)!falseと表示されます。しかし、今私はそれがそのように動作しないと思いますか? idk、私はそれを言葉に入れて苦労している。私はかなりこの物に新しいです:\ – user1164937

答えて

2

ここに謎はありません。私はコードを慎重に読まなかったと思います。関連するスニペットとその意味を以下に示します。

boolean[] found = new boolean[N]; // found[i] = true if card i has been collected 

foundのすべての要素は最初は偽です。 (コメントはfoundアレイの不変を文書化している。)

if (!found[val]) valcnt++; 

!found[val]がtrueの場合はカウンタをインクリメントする(すなわち、それfound[val]はまだ偽である)...

found[val] = true; 

...とのセットをfound[val]をtrueに設定して、このvalを再度カウントしないようにします。

+0

ありがとう!私の心はちょうどこれを読んだ後にクリックした。私は今、とても愚かな気分です。 – user1164937

+0

私はあなたをアップアップできません:( – user1164937

0

初めて誤っています。

int val = (int) (Math.random() * N); 

これは乱数を生成するので、このループではより多くの1つの発言が生成されることがあります。最初の時刻に5が生成された場合、found[5]はfalseですが、2回目にtrueになるため、条件はfalseになり、もう一度valcnt++;には到達しません。

2

チェック後、何が起きても、found[val]trueに設定されます。だからif (!found[val])は基本的には "私がこの前にvalを見たことがない"という意味です。

最後に、valcntは一意の数であるvalで終了します。

0

'val'は0とN-1の間のランダムな整数です。同じ値がwhileループで2回発生し、そのインデックスで見つかったものを一度だけ更新したいとします。

関連する問題