понимание логического! массива [я] в Java - PullRequest
2 голосов
/ 19 февраля 2012

http://introcs.cs.princeton.edu/java/14array/CouponCollector.java.html

Хорошо, так из того, что я понимаю, если

boolean[] found = new boolean

не инициализируется, ему присваивается логическое значение по умолчанию, которое равно false. Но поскольку негатрон false имеет значение true (!found[val]), как получается, что это условие работает, когда все логические значения установлены в значение по умолчанию (false)? Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 19 февраля 2012

Здесь нет никакой тайны. Я думаю, что вы просто не читали код внимательно. Вот соответствующие фрагменты и что они «значат».

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

Все элементы found изначально ложны. (Комментарий документирует инвариант для массива found.)

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

Если !found[val] истинно (т. Е. found[val] все еще ложно), увеличить счетчик ...

    found[val] = true;

... и установите found[val] в true, чтобы мы больше не считали этот val.

2 голосов
/ 19 февраля 2012

После проверки, независимо от того, что происходит, found[val] устанавливается на true. Так что if (!found[val]) в основном означает «если бы я не видел это val раньше».

Конечным результатом является то, что valcnt заканчивается количеством уникальных val с.

0 голосов
/ 19 февраля 2012

Потому что 'val' - это случайное целое число от 0 до N-1. Одно и то же значение может встречаться дважды в цикле while, и вы хотите обновить найденный по этому индексу только один раз.

0 голосов
/ 19 февраля 2012

Есть ложь в первый раз.

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

это генерирует случайное число, поэтому в этом цикле может быть сгенерировано более одного, скажем, пятерок. Когда 5 генерируется в первый раз, found[5] ложно, но во второй раз оно истинно, поэтому условие ложно и valcnt++; больше не будет достигнуто.

...