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

топ 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.

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

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

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

Архив записей в блогах:
Лидер партии "Гражданская платформа" Михаил Прохоров примет решение об участии в президентских выборах по итогам выборов в Госдуму в 2016 году. Так он заявил. Странно, но факт. И я тоже приму решение об участии в президентских выборах по итогам выборов в Госдуму в 2016 году. Жалко, что ...
Речь в рассказе, если помните, идёт о пари, заключённом между банкиром, считающим, что пожизненное заключение хуже, чем смертная казнь, и юристом, обязавшимся доказать личным примером, что многолетняя изоляция от общества не так уж страшна. ...
Нашел хороший сервис как сделать перепост в жж . Для этого пишем пост и сохраняем его в блоге. Потом копируем линк поста в адресной строке браузера и переходим по вышеуказанной ссылке. Идем в меню кнопка перепоста и нажимаем "далее" После чего ...
О Готфриде Бульонском – и Плано Карпини В этот день 1099 года, всего спустя неделю после взятия и разграбления Иерусалима, крестоносцы избрали королём одного из своих вождей – Готфрида Бульонского. Впрочем, согласно распространённой легенде, скромный рыцарь откажется принять ко ...
"То, что есть «Ведомости» и РБК, это ненадолго, перед выборами 2018 не будет ни «Ведомостей» ни РБК". Два действа одновременно происходили в Москве: прямая линия Путина и обыски в группе ОНЭКСИМ, принадлежащей Михаилу Прохорову. С чем это связано, почему, зачем понадобился Прохоро ...