пятница, 23 ноября 2007 г.

Java Puzzle 64: The Mod Squad

Следующая программа генерирует гистограмму чисел по модулю 3. Что она напечатает?
int[] histogram = new int[3];
int value = Integer.MIN_VALUE;
do {
    int index = Math.abs(value) % 3;
    histogram[index]++;
} while (value++ != Integer.MAX_VALUE);
for (int i = 0; i < 3; i++) {
    System.out.println(histogram[i]);
}

Считай - не считай... Но эта программа сгенерирует исключение ArrayIndexOutOfBoundsException: -2
Проблема в том, что метод Math.abs возвращает неотрицательное число всегда, кроме одного случая когда аргумент равен Integer.MIN_VALUE. В этом случае результат тоже равен Integer.MIN_VALUE. А при получении остатка от деления отрицательного числа получается отрицательный остаток. А ведь мы используем его в качестве индекса массива...

Java Puzzle 63: More of the Same

В этой задаче приводится программа, аналогичная предыдущей, но вместо IdentityHashMap используется HashMap:
public class MoreNames {
    private Map map = new HashMap();
    public void MoreNames() {
        this.map.put("Mickey","Mouse");
        this.map.put("Mickey","Mantle");
    }
    public int size() {
        this.map.size();
    }
    public static void main(String[] args) {
        MoreNames map = new MoreNames();
        System.out.println(map.size());
    }
}

Ну почему он возвращает 0? А потому, что первый метод не является конструктором. Случайно добавив возвращаемый тип к декларации конструктора можно долго искать эту ошибку. Аккуратнее! ;)

Traveler IQ Challenge

Забавный тест на знание географии:

Я дошел до седьмого уровня: