Опубликован: 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.

алексеи федорович
алексеи федорович
Беларусь, рогачёв
Тамара Ионова
Тамара Ионова
Россия, Нижний Новгород, НГПУ, 2009