Опубликован: 23.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский физико-технический институт
Лекция 4:

Контейнеры

Аннотация: Способы создания массивов: new, квадратные скобки, создание "на лету". Многомерные массивы - массивы массивов. Сортировка: чисел, строк, объектов по полю, сортировка с помощью пользовательской функции. Эмуляция списка, стека, очереди при помощи массива. Эмуляции хэш-таблицы при помощи объекта общего вида. "Смешанный" массив (с ключами как числовыми, так и нет). Строки: создание при помощи кавычек и new, различные функции выделения подстроки. Быстрая замена подстроки.

Во Флэш МХ имеется встроенная библиотечка объектов-контейнеров. Обычно в библиотеках контейнеров (такой, например, как стандартная библиотека С++) можно найти контейнеры, оптимизированные для всех случаев жизни - по скорости выполнения самых разных операций, по занимаемой памяти и пр. Создатели Флэша поступили проще: они, резонно полагая, что главная оптимизация состоит в использовании заранее скомпилированного компонента, предлагают нам для большинства задач один универсальный контейнер. Это класс Array. Однако, судя по названию, основной его задачей является играть роль массива, поэтому посмотрим, как он с этой задачей справляется.

Массив: различные способы создания

Сейчас мы рассмотрим все способы создания массива, причем начнем с устаревших, а закончим самыми совершенными и удобными.

Эмуляция массива

Во Флэше версии 4 настоящих массивов не было и выкручиваться приходилось примерно так:

for (var i=0; i<5; i++) set("a" + i, 5*i + 1);

// Обращаемся к конкретному элементу
trace("a2 = " + a2);
i = 4;
// Обращаемся по номеру, записанному в переменной
trace("a" + i + " = " + eval("a" + i));

Выводит этот код (который, правда, напрямую перенести во Флэш 4 нельзя - мы хотя и не использовали массивы, но зато применили ряд других вещей, которых в четвертой версии Флэша не было) следующие строчки:

a2 = 11
a4 = 21

Во Флэш МХ делать подобные вещи смысла не имеет. (Хотя генерация серий имен, бывает, применяется при создании наборов похожих клипов.) Гораздо лучше пользоваться встроенным объектом типа Array.

Создание массива с помощью new

Создать объект типа Array можно, например, так (на выбор целых три способа):

a_array = new Array(2,3,"AAA",4,8);
b_array = new Array(10);
c_array = new Array();
// Обращаемся к конкретному элементу
trace("a_array[1] = " + a_array[1]);
i = 3;
// Обращаемся по номеру, записанному в переменной
trace("a_array[" + i + "] = " + a_array[i]);
c_array[7] = 9;
// Длину массива можно узнать, обратившись к специальному
// свойству length
trace("a_array.length = " + a_array.length);
trace("b_array.length = " + b_array.length);
trace("c_array.length = " + c_array.length);

Выводит этот код следующее:

a_array[1] = 3
a_array[3] = 4
a_array.length = 5
b_array.length = 10
c_array.length = 8

Посмотрим также, какие переменные заведены в программе (надо после запуска на исполнение нажать Ctrl+Alt+V ). Получим:

Level #0:
Variable _level0.$version = "WIN 6,0,21,0"
Variable _level0.a_array = [object #1, class 'Array'] [
  0:2,
  1:3,
  2:"AAA",
  3:4,
  4:8
 ]
Variable _level0.b_array = [object #2, class 'Array'] []
Variable _level0.c_array = [object #3, class 'Array'] [
  7:9
 ]
Variable _level0.i = 3

Итак, с точки зрения С++ или Java класс Array имеет три разных конструктора. Один из них - тот, в который передается больше одного аргумента - создает массив из всех аргументов, переданных в конструктор. Второй - с одним числовым аргументом - создает массив указанной длины, хотя и незаполненный. Наконец, третий, вовсе без аргументов, просто создает массив с нужным именем. Длина его первоначально нулевая. Однако, если мы попытаемся записать что-либо в ячейку массива, которая еще не создана, массив немедленно расширится до нужного размера.

Заодно, на этих примерах мы убедились, что во Флэш МХ, как и в C++ и Java, массивы нумеруются с нуля.

Обратите внимание, что в названии наших массивов мы используем суффикс _array. Это позволяет нам пользоваться контекстной подсказкой: сразу после постановки точки вслед за именем переменной с таким суффиксом на экране появится всплывающее меню, из которого мы сможем выбрать нужный метод (или поле) класса Array.

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет