среда, 12 декабря 2007 г.

Гироскоп в руке

У нас в Сане сейчас бум на кистевые тренажеры PowerBall. В нашей комнате валяется такая модель (со счетчиком). Я долго был рекордсменом (11604 об/мин), но Леонид побил мой рекорд буквально 5 минут назад (11880 об/мин). Надо дальше тренироваться...
Хороший подарок на Новый Год. Мне, например, такая модель нравится.

Одноклассники

Пили пиво со школьными друзьями: Сергей Шумский, Алексей Матц и Алексей Разницын. Не виделись лет 15!
Хорошо посидели. Выпили весь Guinness в кабаке Медведь. Много о чем поболтали. Собираемся собрать побольше народу на февральский слет выпускников, так как, говорят, что наша классный руководитель последний год работает. Надо бы успеть повидаться. Интересно, что некоторые не поменялись совсем, а других никак не узнать.

День выборов

Выборы! Выборы! Кандидаты - ...
Второго декабря я был в Таллинне. Известная проблема, что половина населения Эстонии - русские, половина из которых - граждане России. Голосовать я в Таллинне не мог, так как зарегистрирован в подмосковье. Но очереди видел.
Первая очередь от консульства России на улице Лай доходила до олененка, поворачивала в сторону улицы Пикк, по которой уходила в даль. Вторая - от гостиницы SAS, что за Домом Торговли, мимо здания парковки уходила в даль по улице Рявала. Концов этих очередей я не видел - было не по пути. Народ, в основном, пожилой. Молодых напрягает стоять в очередях по несколько часов.

Java Puzzle 66: A Private Matter

Что напечатает следующая программа?
class Base {
    public String name = "Base";
}
class Derived extends Base {
    private String name = "Derived";
}
public class PrivateMatter {
    public static void main(String[] args) {
        System.out.println(new Derived().name);
    }
}
Программа не скомпилируется. Дело в том, что поля класса не могут переопределять поля суперкласса как, например, методы. В данном случае класс Derived скрывает поле name класса Base (JLS 8.3). Это корректно, но нерекомендуется, так как противоречит принципу Лискова: если что-то можно делать с базовым классом, то то же самое должно быть возможно делать с его потомком. Чтобы решить проблему с доступом к полю name класса base надо переписать код так:
public class PrivateMatter {
    public static void main(String[] args) {
        System.out.println(((Base) new Derived()).name);
    }
}

Java Puzzle 65: A Strange Sage of a Suspicious Sort

Всю программу приводить не буду. Приведу пример неправильной реализации компаратора, из-за которого вся программа сортировки работает неправильно.
class IntegerComparator implements Comparator {
    public int compare(Integer i1, Integer i2) {
        return i2 - i1;
    }
}
Идиома, лежащая в основе этой имплементации, известна с ранних дней UNIX (1970). Поэтому многие уже не помнят, а остальные не знают, решение этой проблемы. Помните, что компьютерная математика отличается от обычной. И при вычитании большого положительного числа из большого отрицательного числа можно получить положительное, а не отрицательное. Это называется - переполнение разрядной сетки...
Вот правильная имплементация:
class IntegerComparator implements Comparator {
    public int compare(Integer i1, Integer i2) {
        if (i1 > i2) return -1;
        if (i1 < i2) return 1;
        return 0;
    }
}
После анализа кода становится ясно, что этот компаратор предназначен для сортировки в обратном порядке. Так что не надо городить своих классов. Используйте компаратор, входящий в состав библиотеки коллекций:
Collections.reverseOrder()