Обман сознания

топ 100 блогов lex_kravetski05.01.2013 Поставил эксперимент. Точнее, он сам случайно поставился.

Довольно простая задача. Есть массив (или какой-то ещё список) с элементами. Назовём его elements. Есть массив с несколькими индексами. Назовём его indices. Нужно получить новый массив, в который войдут те элементы из elements, индексы которых содержались в indices. Проще говоря, из полного набора элементов выбрать, скажем так, заселекченные.

Удивительно, но несколько моих знакомых программистов практически в один голос начали с примерно такого маршрута: будем итерировать от 0 до elements.size и для каждого номера проверять, есть ли он в indices. Если есть — добавлять соответствующий элемент в новый массив. Точнее, нет, будем итерировать по elements и увеличивать на единицу счётчик. Проверять, есть ли, добавлять текущий. Точнее, нет, добавим содержимое indices в Set, чтобы быстрее проверять.

Я и сам машинально пошёл сначала по этому маршруту — именно поэтому и решил провести подобный эксперимент. Почему так происходит — не знаю. Видимо, от сильной привычки извёрнуто итерировать.

Хотя на самом деле решение мега-тривиальное: итерируем по indices, и добавляем в новый буфер массива elements(indices(i)). Тривиальное, но приходит оно почему-то вторым по счёту, а не первым. «Снимаем чайник с плиты, выливаем из него воду и таким образом приводим задачу к уже решённой».

На Scala решение записывается совершенно очаровательной в своей простоте конструкцией.

indices map elements

Смысл в том, что поскольку массив indices — коллекция, для неё определена операция map. То есть, преобразование коллекции путём преобразования каждого её элемента при помощи переданной в аргумент функции. Но функция извлечения из скала-коллекции — это просто apply, то бишь, при вызове — просто индекс в скобках после имени переменной: elements(i).

Полная запись была бы такой:

indices.map(i ⇒ elements(i))

Однако для такого тривиального случая есть и сокращённый вариант записи. Приведённый выше. Имя ссылки на контейнер одновременно может выступать и как имя функции от одного аргумента с параметром типа Int.

Последующий эксперимент показал, что эта простая запись — настолько простая, что некоторых людей способна ввести в прострацию и заставить искать в ней какой-то подвох.

Очевидное неочевидное.

Оставить комментарий

Архив записей в блогах:
Республиканцы отстранили Маккарти от должности спикера. Это первый случай в истории. Восемь республиканцев проголосовали за отстранения, и поскольку у республиканцев большинство в Хаусе всего лишь 222-213, пяти голосов было бы достаточно, учитывая, что демократы в поддержку Маккарти не ...
В экономике я конечно дуб, из лекций в универе помню только "потребности человека безграничны, а возможности всегда ограничены", это какое-то открытие было для меня, ведь если это закон  и он работает, то все становится понятно))) Ну, а сказать хотел про кэшбэки, карты, скидки и ...
Волатильность (изменчивость цены) нефти с начала года просто зашкаливает: нефть показала, что может за день как вырасти на 10%, так и легко упасть на такую же величину. Вчера-позавчера нефть снова приблизилась к многолетним лоям (минимальным значениям), показанным в конце января этого 2 ...
Leaf House – особняк, спроектированный архитекторами и дизайнерами компании Mareines + Patalano Arquitetura. Этот красивейший бразильский цветок «посажен» близ Рио-де-Жанейро на небольшом пляже с лазурной водой и является эко-сооружением. Идея создания ...
Последние дни, после того, как началась история с организацией пропутинского митинга на Поклонной горе, мне стали писать люди из разных государственных организаций с сообщениями о том, как их заставляют идти на этот митинг. Сообщения ...