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

Java Puzzle 60: One-Liner

Этот вопрос проверяет знание API. Для каждой мини-задачки необходимо написать метод, содержащий только одну строку. Тестируется знание новый фич Java 1.4 и 5. Авторы утверждают, что знание библиотек может сэкономить много времени и увеличить скорость и качество программ. Насчет качества - несомненно, но вот насчет скорости...

A. Напишите метод, принимающий список элементов и возвращающий список элементов в том же порядке, но без дубликатов. Например, передаем список {"spam", "sausage", "spam", "spam", "bacon", "spam", "tomato" и "spam"}, а получаем список {"spam", "sausage", "bacon" и "tomato"}.

Тут необходимо вспомнить про полезный класс LinkedHashSet, базирующийся на классе LinkedHashMap, который сохраняет порядок добавления записей. Метод будет выглядеть следующим образом:
static <E> List<E> noDups(List<E> list) {
    return new ArrayList<E>(new LinkedHashSet<E>(list));
}

B. Напишите метод, принимающий строку, содержащую 0 или больше токенов, разделенных запятой, и возвращающий массив строк, содержащий токены в том порядке, как они встречаются во входной строке.

Если вы подумали про StringTokenizer, то вы очень давно программируете на Java, как и я. В версии 1.4 была добавлена поддержка регулярных выражений (java.util.regex). Давно пора их выучить, так как размер кода существенно сокращается:
static String[] parse(String string) {
    return string.split(",\\s*");
}

C. Напишите метод, который преобразует некоторый многомерный массив к строковому виду, который был бы удобен для целей отладки.

Тут авторы прикололись. Такой метод уже есть в JDK: Arrays.deepToString(Object[]). Кроме него есть еще пара полезных методов: Arrays.deepEquals(Object[],Object[]) и Arrays.deepHashCode(Object[]). И хотя в этом методе не одна строка, наш метод может просто вызывать библиотечный:
static String toString(Object[] array) {
    return Arrays.deepToString(array);
}

D. Напишите метод, принимающий два целых числа и возвращающий true, если у них установлено одинаковое количество бит.

Для целочисленных типов (Integer и Long) в Java 5 были добавлены методы работы с битами. Воспользуемся методом Integer.bitCount(int), который возвращает количество установленных бит в целом числе:
static boolean equals(int one, int two) {
    return Integer.bitCount(one) == Integer.bitCount(two);
}

Java Puzzle 59: What's the Difference?

В задачке используется массив предопределенных значений. Суть задачки не важна, так как сконцентрировавшись на ее решении можно упустить очевидное. Я натыкался на такие проблемы, когда начинал изучать Java. Вот массив значений каждое из которых меньше предыдущего на 111:
int[] values = {
        789, 678, 567, 456,
        345, 234, 123, 012 };
Или нет?

Согласно JLS 3.10.1 целочисленные литералы, начинающиеся с 0 интерпретируются как числа, записанные в восьмеричной системе счисления. Таким образом, последние значение равно 10. Авторы рекомендуют никогда не выравнивать целочисленные литералы с помощью 0. А так хочется иногда иметь красивую табличку в коде!

Тяжелое наследие Fortran и C...
Неужели сейчас кто-то использует восьмеричную систему?

Gmail поддеживает IMAP

Google добавил поддержку IMAP в почтовый сервер. Знаю многих любителей этого дела, но я сам сторонние почтовые клиенты теперь не люблю. Метки рулят!