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

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

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

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

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

Архив записей в блогах:
А пора бы. Пара картинок со стима и с сайта разработчика: А вот и совсем свежий только вышедший модуль, которого в стиме нет и хз когда появится. Ибо мираж который они выпустили уже наверное с пол года назад до сих пор в стиме не появился. ...
Читать далее ...
13 августа немцам удалось перерезать шоссейную и железную дороги Кингисепп – Ленинград, а также форсировать реку Луга. 14 августа 41 моторизованный и 38 армейский корпуса немцев вырвались на оперативный простор и двинулись на Ленинград. 16 августа пали Нарва и Кингисепп. В этот же де ...
Смесь принцесс Анны и Рапунцель - это типа такая княжна. Из полнометражного украинского мультика. Ни разу не попизжено у Диснея, ага. И этот мнэээ... Черномор ни разу не напоминает Джафара из "Аладдина", которому для пущей импозантности влепили Всевидящее Око вместо рубина. И ...
Расскажите, пожалуйста, что вас НЕ устраивает в питании вашего ребенка в детском саду? Не устраивает с точки зрения полезности - вкусы, понятно, у всех разные, и не все нормально едят столовскую еду. Тут недавно кто-то жаловался, что в напитки и каши добавляют слишком много сахара... а кто ...