Нужна помощь в написании скрипта? Close

Вы можете задать любой вопрос по программе Autohotkey в нашей группе Вконтакте. Если решение требует более высокой квалификации- можно обратиться непосредственно ко мне.

ВконтактеГруппа Вконтакте Электронная почтаЭлектронная почта Личная страницаСимаков Яков ВК
home icon Все разделы
comunity icon Нужна помощь?

Массивы -Autohotkey

Массивы (arrays) - это упорядоченные наборы данных, представляющие собой список однотипных элементов.

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

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

Традиционный способ:

Array := [] ;объявим массив Array[1] := 10 ;запишем число в ячейку 1 Array[2] := "test" ;запишем строку в ячеку 2 Array[name] := "Васян" ;запишем строку в ячейку name MsgBox, % Array[name] ;выведем сообщение с содержымым name

Объектный способ:

Array := Array() ;объявим массив Array.1 := 10 ;запишем число в ячейку 1 Array.2 := "test" ;запишем строку в ячеку 2 Array.name := "Васян" ;запишем строку в ячейку name MsgBox, % Array.name ;выведем сообщение с содержымым name

При объявлении простых массивов можно сразу внести значения в ячейки. Обратите внимание, что в Autohotkey, в отличае от большинства языков, при создании предварительно заполненного значениями массива, нумерация элементов начинается с 1.

Array := [10, "test", 999] ;создаем предварительно заполненный массив MsgBox, % Array[1] ;выведем содержимое первой ячейки

Перебор массива

Для перебора всех элементов массива можно использовать цикл Loop или For. Второй является более наглядным и в большинстве случаев рекомендуется использовать именно его.

Array := [10, "test", 999] ;создадим массив ;Поочередно выведем все элементы массива устаревшим способом Loop % Array.MaxIndex() { MsgBox, % "Элемент номер: " A_Index ", значение: " Array[A_Index] } ;Поочередно выведем все элементы массива рекомендуемым способом for index, element in Array { MsgBox, % "Элемент номер: " index ", значение: " element }

Поведение Loop и For несколько отличается:

- Loop полностью игнорирует именные ячейки, т.е. Array["name"] был бы пропущен. Так же, конструкция Array.MaxIndex() выведет именно максимальный индекс ячейки. Это значит, что цикл пройдет все индексы от 1 до максимального, обходя даже несуществующие элементы.

- For же, наоборот, обходит только существующие элементы массива, при том, как с числовыми индексами, так и именные. В этом случае именные элементы выводятся после числовых.

Многомерные массивы

Многомерным называется массив из массивов. Соответственно, в таком массиве каждая ячейка является объектом.

;Создадим массив с данными учащихся ;Который бы содержал имя, рост и вес для каждого Students := [] Students[1] := ["Васян", 186, 84] Students[2] := ["Арсений", 168, 65] Students[3] := ["Илья", 171, 72] ;Для обхода такого массива можно использовать тот же способ: for index, element in Students { MsgBox, % "Студент номер: " index ", Имя: " Students[index][1] ", Рост: " Students[index][2] ", Вес: " Students[index][3] } ;Так же, для обращения к элементам многомерного массива ;Можно использовать Students[index, 1] и т.д.

При объявлении нового элемента многомерного массива необходимо использовать исключительно конструкцию Array[i, k], в то время как для последующего обращения к элементу подойдет любая из конструкций: Array[i,k], Array[i][k], Array.i.k

Псевдо-массивы

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

ArrayCount := 3 ;Число элементов псевдо-массива Array1 := 10 Array2 := 500 Array3 := "test" ;Поочередно выводим все элементы псевдо-массива Loop %ArrayCount% { MsgBox, % "Индекс элемента: " A_Index " значение: " Array%A_Index% }

Тот же метод используется и для построения многомерных псевдо-массивов, например: Array_i_k.

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

Функции для работы с массивами

Push()

Добавляет элемент(ы) в конец массива

Array.Push(Value, Value2, ..., ValueN)

Если массив был пустым или содержал только именные ключи- новый элемент будет добавлен с индексом 1.
Если массив содержал элементы с числовым индексом- новый элемент будет добавлен после наибольшего индекса.

InsertAt()

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

Array.InsertAt(Pos, Value1 , Value2, ... ValueN) ;Пример Array := [] Array.InsertAt(1, "A", "B") ; => ["A", "B"] Array.InsertAt(2, "C") ; => ["A", "C", "B"]
RemoveAt()

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

Array.RemoveAt(Pos , Length) ;Пример Array := ["A", "B", "C", "D", "E"] Array.RemoveAt(2, 3) ; => ["A", "E"] ;т.к. начиная с индекса 2 были удалены 3 элемента

Если Length не указана, возвращается значение, удаленное из Pos (пусто, если не удалено ничего).
В противном случае возвращаемое значение - это количество удаленных элементов, которые имели значения.

Pop()

Удаляет последний элемент массива и возвращает его значение

Array.Pop() ;Пример Array := ["A", "B", "C"] MsgBox, % "Удален элемент со значением " Array.Pop()
Delete()

Удаляет элемент(ы) массива без смещения последующих.
Можно указать диапазон ключей для удаления, используя параметры FirstKey, LastKey. Число должно быть целым и FirstKey <= LastKey.

Array.Delete(Key) Array.Delete(FirstKey, LastKey) ;Пример Array := ["A", "B", "C"] Array.Delete(2) ;удалим "B" MsgBox, % Array[2] ;будет пустым, т.к. смещения не происходит

Если Length не указана, возвращается значение, удаленное из Pos (пусто, если не удалено ничего).
В противном случае возвращаемое значение - это количество удаленных элементов, которые имели значения.

Clone()

Возвращает копию массива.

Clone := Array.Clone()
MaxIndex()

Если в массиве присутствуют целочисленные ключи- возвращает наибольший.

MaxIndex := Array.MaxIndex()
MinIndex()

Если в массиве присутствуют целочисленные ключи- возвращает наименьший.

MinIndex := Array.MinIndex()
Length()

Возвращает длину массива относительно ячейки 1. Учитывает только положительные числа, начиная от 1.
Вернет 0, если положительных целочисленных ключей в массиве нет.

Length := Array.Length() ;Пример MsgBox % ["A", "B", "C"].Length() ;3 MsgBox % ["A", , "C"].Length() ;3 MsgBox % {-10: 0, 10: 0}.Length() ;10 MsgBox % {-10: 0, -1: 0}.Length() ;0
Count()

Вернет число элементов массива, учитывая именные и с индексом меньше 1.

Count := Array.Count() ;Пример MsgBox % {A: 1, Z: 26}.Count() ;2 MsgBox % ["A", "B", "C"].Count() ;3 MsgBox % ["A", , "C"].Count() ;2
Автор перевода: Яков Симаков