Введение в массивы

Обучая разработчиков я обнаружил, что массивы вызывают на столько большое смущение, что множество хороших разработчиков стараются не использовать их в своем коде. Один мой друг объяснил, почему он не использует массивы: "Они такие примитивные", а также добавил: "За 5 лет моей практики в разработке ColdFusion приложений я всегда находил способ обойти их."

Я думаю, что с этими словами согласятся очень многие разработчики, которые начали заниматься разработкой без знания основ компьютерной граммотности. В то время как, несомненно, есть способы обходиться без массивов, разработчики, поступая так, лишают себя очень полезного инструмента для решения большого количества задач. Таких разработчиков можно сравнить с плотником, который не хранит особо полезный инструмент в своем чемоданчике с инструментами. Самое забавное в этой ситуации то, что массивы - члены группы так называемых "комплексных типов данных" и могут делать наш код более простым и более гибким при вынужденных его изменениях.

Все переменные представляются нам как пара элементов: имя/значение. В этом примере:
имя переменной - MyName, а значение - Иван Петрович.

Значения переменных имеют свойство, известное как тип данных. Некоторые языки (например, Java) требуют обязательного указания типа данных. ColdFusion - это пример языка, в котором уакзывать тип данных не обязательно, т.к. это происходит овтоматически скрыто от разработчика. В приведенном выше примере значение переменной MyName имеет тип данных - "строка" ("string").

Типы данных могут быть простыми или комплексными. Простые типы данных включают в себя строковые, числовые и булевы значения. Комплексные типы данных включают в себя наборы результатов (запроса), структуры и массивы. Массивы - это просто коллекция упорядоченных переменных. Под словом "упорядоченный" я подразумеваю, что тот порядок, в котором вы помещаете переменные в массив может быть важен для вас и управляем. С другой стороны, структуры - это неупорядоченный набор переменных.

Давайте рассмотрим пример, где у нас есть набор чисел, с которыми нам нужно работать - возможно номера дней месяцев года. Мы, конечно, можем обозначить их по отдельности:

Это позволит нам создать и работать с 12 определенными переменными - не так уж и плохо, но если количесто определяемых таким способом переменных будет расти, то их создание также будет усложняться. И если вам понадобится передать все эти переменные в какую-либо функцию, то код стразу же станет слишком кромоздким. В такой ситуации лучше всего создать массив.

Проще всего их представить в виде электронной таблицы:

Days   30 31 30 31 30 31 30 31 30 31 30 31

В то время как электронные таблицы используют буквы для обозначения колонок таблиц, массивы используют для этого цифры:

  1 2 3 4 5 6 7 8 9 10 11 12
Days   30 31 30 31 30 31 30 31 30 31 30 31

Вот код, создающий массив daysInMonth:

Переменная daysInMonth представляет собой весь массив. Чтобы получить информацию об определенном месяце, нужно использовать его индекс: daysInMonth[6]. Индексы располагаются в квадратных скобках.

Одной из прекрасных возможностей массива является то, что вы можете циклически "пробегать" по нему:

Функция ArrayLen() возвращает количество элементов в массиве - полезная штука, особенно когда вы не знаете сколько точно элементов содержит массив.

В ColdFusion есть несколько очень полезных функций для работы с массивами. Вот наиболее часто используемые:
= = =

Пример кода:

Результат:
Среднее кол-во дней по всем месяцам - 30.4166666667

= = =

Функция ArrayClear(имя_массива) удаляет не только значения элементов массива, но и сами элементы, количество которых мы можем получать с помощью функции ArrayLen(имя_массива):

= = =

Пример кода:

Результат:
В массиве 0 элементов.

= = =

Функция ArrayDeleteAt(имя_массива, номер_элемента) удаляет элемент в указанной позиции, смещая влево все остальные элементы, идущие после удаленного.

= = =

Пример кода:

Результат:
Массив содержит 11 элементов.

= = =
Функция ArrayInsertAt(имя_массива, номер_элемента, значение) вставляет новый элемент в массив, смещая все остальные элементы после указанной позиции вправо.
= = =

Пример кода:

Результат:
Теперь в массиве 13 элементов и в 12-ом месяце 35 дней.

= = =
Функция ArrayIsEmpty(имя_массива) возвращает булево значение (истина или ложь, да или нет) в замисимости от того, содержит ли массив элементы.
= = =

Пример кода:

Результат:
Массив содержит элементы.

= = =
Функция ArrayMax(имя_массива) возвращает самое большое значение элемента массива:
= = =

Пример кода:

Результат:
Наибольшее количество дней во всех месяцах - 31.

= = =
Функция ArrayMin(имя_массива) противоположна функции ArrayMax().
= = =

Пример кода:

Результат:
Наименьшее количество дней во всех месяцах - 28.

= = =
Функция ArraySort(имя_массива, тип_сортировки [, порядок_сортировки ]) сиртирует указанный массив по типу и в указанном порядке:
= = =

Пример кода:

Результат:
28 30 30 30 30 31 31 31 31 31 31 31

= = =
Функция ArraySum(имя_массива) возвращает сумму значений всех элементов массива.
= = =

Пример кода:

Результат:
В году 365 дней.

= = =
Функция ArrayToList(имя_массива [, разграничитель ]) возвращает список, составленный из элементов массива; полезна тогда, когда вы захотите применять к вашим данным функции списков. По-умолчанию разграничителем является запятая.
= = =

Пример кода:

Результат:
Упорядоченный список дней в каждом месяце - 31,28,31,30,31,30,31,31,30,31,30,31.

= = =
Приведенный ниже код наглядно иллюстрирует, что значением элемента массива может быть не только число, но и строка:
= = =

Пример кода:

Результат:
Список дней недели: Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье.

= = =

 

Когда данные не подходят для одномерного массива

Конечно, никакие данные не укладываются аккуратно в один ряд. Например, давайте рассмотрим пример, в котором нам нужно управлять информацией о 5 студентах, каждый из которых прошел по 4 теста. Для отслеживания результатов их тестов мы можем создать такую электронную таблицу:

  Анна Саша Ольга Иван Лена
1-ый тест 93 82 99 100 74
2-ой тест 89 78 100 82 82
3-ий тест 94 84 92 96 94
4-ый тест 88 81 100 94 83

Рисунок 2. Данные, которые не помещаются в одномерный массив.

Как мы можем разместить эти данные в массиве? Мы можем разместить эти данные в массиве только при условии, если сможем представить наш массив в виде более чем одной строки. К счастью, сможем, когда исследуем многомерные массивы.

 

Массивы массивов

Лучше всего представлять многомерный массивы как "массив массивов". Немного измененный приведенный выше пример (Рисунок 2) поможет нам более четко представить эту идею. Для большей ясности я убрал названия колонок и рядов таблицы, которые не являются частью массива:

93 82 99 100 74

89 78 100 82 82

94 84 92 96 94

88 81 100 94 83

Рисунок 3. Представление многомерного массива
как набора расположенных друг над другом одномерных массивов.

Этот принцип - ключ к понимаю, как использовать функции массива, для работы с многомерными массивами. Но сперва, давайте создадим этот массив.

 

Создаем двумерный массив

Если бы нам было нужно работать только с первым "рядом" (результаты первого теста), то создание массива было бы очень простым:

Каждое число в квадратных скобках (индекс) - это номер колонки. Для работы с массивами в двух измерениях (ширина и высота), нам нужно указывать два индекса, чтобы указать на определенный элемент массива. Первый индекс будет указывать номер ряда, а второй - номер колонки. Код для создания двумерного массива будет выглядеть так:

 

Работаем с элементами двумерного массива

Как Ольга (чей результат представлен в третьей колонке) прошла второй тест (представленный во втором ряду)? Давайте выясним:

= = =

Пример кода:

Результат:
Ольга получила 100 за свой второй тест.

= = =
А что Лена получила за свой первый тест?
= = =

Пример кода:

Результат:
Лена получила 74 за свой первый тест.

= = =

 

"Пробегаем" циклом по двумерному массиву

Получение данных из двумерного массива потребует от нас использовать 2 цикла, располженных друг в друге. Начнем циклически обходить ряды и одновременно циклически обходим значения каждого ряда:

= = =

Пример кода:

Результат:
93 87 99 100 74
89 78 100 82 82
94 84 92 96 84
88 81 100 94 83

= = =
Если вы хотите представить результат в виде электронной таблицы, то нужно всего-лишь немного изменить код, поместив выводимые данные в таблицу:
= = =

Пример кода:

Результат:
93 87 99 100 74
89 78 100 82 82
94 84 92 96 84
88 81 100 94 83

= = =

 

Использование ColdFusion функций массива

Как встроенные ColdFusion функции работают с многомерными массивами? К сожалению, в документации по CF этому уделяется очень мало внимания, поэтому мы сами разберемся с этим и станем более просвещенными. Для этого следует обратить внимание на циклы приведенного выше примера кода. Там мы использовали функцию ArrayLen().

Сначала мы использовали функцию ArrayLen() во внешнем цикле:
Когда мы используем формулировку ArrayLen(имя_массива), где имя_массива - это имя многомерного массива, то в ответ получаем количество рядов массива. В нашем примере функция ArrayLen(twodee) вернет нам число 4. Но если бы у нас был одномерный массив, то мы бы получили количество его колонок.

Нам нужны и ряды и колонки. Получить количество рядов, как мы уже убедились, легко - достаточно применить функцию ArrayLen() к нашему многомерному массиву. Но, чтобы получить количество колонок нам нужно применить эту же функцию, но к одномерному массиву, которого у нас нет. Или есть? Посмотрите еще раз на рисунок 3. Как я уже говорил, многомерный массив можно представить в виде одномерных массивов, расположенных друг над другом. Так вот нам и нужны именно эти одномерные массивы в каждом ряду.

Следуя нашей логике, twodee - это четыре одномерных массива, расположенных друг над другом. Теперь мы говорим ColdFusion, что хотим получить доступ к одному из них, указывая имя массива и номер ряда: twodee[1]. Данная формулировка представляет собой первый ряд в нашем многомерном массиве. Какое число покажет нам выражение ArrayLen(twodee[1])?

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

Большинство ColdFusion функций массива созданы для работы с одномерными массивами и могут применяться как просто к одномерным массивам, так и к одномерным массивам внутри многомерного массива. Приведенные ниже иллюстрации демонстрируют разные результаты одних и тех же функций, в зависимости от типа массива. Под буквой А подразумевается одномерный массив, а под буквой B - двумерный.













Теперь, когда мы разобрались в том, что же такое массивы, их загадочность исчезла и они стали тем, чем и должны быть - чрезвачайно полезными конструкциями, которые действительно делают наш код проще. Для получения большей информации о массивах, а также, чтобы проверить свои знания о них вы можете заглянуть на сайт автора этой статьи - www.halhelms.com.


Источник: www.sys-con.com/coldfusion/articlea.cfm?id=545
                  www.sys-con.com/coldfusion/articlea.cfm?id=557

 


Hosted by uCoz