SourcePawn [SourcePawn] Урок 9 - ADT Array (ArrayList)

Pushistik↯❤

Команда форума
Регистрация
6 Июл 2017
Сообщения
393
Реакции
97
Баллы
28
[SourcePawn] Урок 9 - ADT Array (ArrayList)
<= К содержанию
ArrayList - производный тип от Handle, который являет собою автоматически расширяемый массив, позволяющий хранить в себе данные разных и почти любых типов.
Размер массива увеличивается по мере добавления в него данных. Так же он уменьшается при удалении данных.

Методы для работы с ArrayList можно найти здесь ArrayList· adt_array· SourceMod Scripting API Reference

Рассмотрим их подробнее:
  • Методы ArrayList
    • ArrayList - Создает объект типа ArrayList
      PHP:
      ArrayList(int blocksize, int startsize)
      • int blocksize - количество ячеек в каждом элементе массива. По умолчанию = 1.
        PHP:
        int iArray[X][32]; // 32 и будет значением blocksize
        Это часто используется при хранении строк (или других массивов) в этом массиве.
        Например, зная что в массиве будут хранится строки, размер которых, не превышает 64 символа мы должны создать ArrayList так:
        PHP:
        ArrayList hArray = new ArrayList(ByteCountToCells(64));
        Функция ByteCountToCells возвращает количество ячеек необходимых для хранения указанного количества байт.
      • int startsize - устанавливает начальный размер массива. По умолчанию = 0.
        PHP:
        ArrayList hArray = new ArrayList(); // Пустой массив
        
        ArrayList hArray = new ArrayList(ByteCountToCells(64)); // Пустой массив с размером элементов 64 ячейки
        
        ArrayList hArray = new ArrayList(1, 8); // Массив из 8-ми элементов равных 0, размер каждого элемента - 1 ячейка
    • Push - Добавляет элемент в конец ArrayList. Возвращает индекс добавленного элемента.
      PHP:
      hArray.Push(6); // Добавим в конце массива элемент со значением 6
      hArray.Push(7.3); // Добавим в конце массива элемент со значением 7.3
    • PushString - Добавляет элемент типа char в конец ArrayList. Возвращает индекс добавленного элемента. Если размер записываемой строки больше чем максимальный размер элемента - строка будет обрезана.
      PHP:
      hArray.PushString("my string"); // Добавим в конце массива строку
      hArray.PushString("two string");
    • PushArray - Добавляет элемент (массив) в конец ArrayList. Возвращает индекс добавленного элемента.
      PHP:
      hArray.PushArray({6, 9}, 2); // 6 и 9 элементы массива, 2 - размер массива
      hArray.PushArray({5.2304, -3412.340, 0.35}, 3); // Таким образом можно записывать координаты или углы (float[3])
    • Set - Устанавливает значение указанному элементу ArrayList.
      PHP:
      void Set(int index, any value, int block, bool asChar)
      • int index - Индекс элемента
      • any value - Значение
      • int block - Индекс блока для записи (при blocksize > 0)
      • bool asChar - true если записываем символ, а не значение
      PHP:
      hArray.Set(3, 6); // Установим элементу с индексом 3 значение 6
      hArray.Set(0, 7.3); // Установим элементу с индексом 0 значение 7.3
      // Если массив имеет вид:
      
      ArrayList hArray = new ArrayList(3, 15); // Размер элемента = 3, Размер массива = 15.
      // Этот Массив предназначен для хранения координат. Если хотим изменить x координату элемента с индексом 3
      hArray.Set(3, -5.001, 0); // x = 0, y = 1, z = 2
      // Если хотим изменить z координату элемента с индексом 9
      hArray.Set(9, 27.846, 2); // x = 0, y = 1, z = 2
    • SetString - Устанавливает значение типа char элементу ArrayList.
      PHP:
      hArray.SetString(4, "my string 4"); // Индекс 4
    • SetArray - Устанавливает массив значений элементу ArrayList.
      PHP:
      hArray.SetArray(2, {6, 9}, 2); // Индекс 2
      hArray.SetArray(7, {5.2304, -3412.340, 0.35}, 3); // Индекс 7
    • Get - Получает значение элемента ArrayList.
      PHP:
      int iVar1 = hArray.Get(3); // Индекс 3
      float fVar2 = hArray.Get(7); // Индекс 7
    • GetString - Получает строчное (char) значение элемента ArrayList.
      PHP:
      char szBuffer[64];
      hArray.GetString(4, szBuffer, sizeof(szBuffer)); // Индекс 4
    • GetArray - Получает массив значений элемента ArrayList.
      PHP:
      int iArray[2];
      hArray.GetArray(7, iArray, 2); // Индекс 7
      
      float fPosition[3];
      hArray.GetArray(12, fPosition, 3); // Индекс 12
    • Clear - Очищает ArrayList.
      PHP:
      hArray.Clear();
    • Resize - Устанавливает размер элементов ArrayList.
      PHP:
      hArray.Resize(6);
    • Clone - Создает копию ArrayList.
      PHP:
      ArrayList hArray2 = hArray.Clone(6);
    • Erase - Удаляет элемент из ArrayList. Все индексы больше указанного смещаются вниз на 1 позицию.
      PHP:
      hArray.Erase(6); // Удалим элемент с индексом 6
      
      //    Если в массиве было:
      //    Индекс - Значение
      //    0 - 7
      //    1 - 32.5
      //    2 - 89
      //    3 - 587
      //    4 - 2.23
      //    5 - 5.98
      // Теперь если удалить элемент с индексом 2:
      hArray.Erase(2);
      // Получаем:
      //    0 - 7
      //    1 - 32.5
      //    2 - 587
      //    3 - 2.23
      //    4 - 5.98
    • ShiftUp - Смещает все элементы ArrayList начиная с указанного на 1 индекс вверх. При этом значение этого элемента становится не определено и может содержать что угодно.
      PHP:
      // Имеем ArrayList:
      //    0 - 7
      //    1 - 32.5
      //    2 - 89
      //    3 - 587
      //    4 - 2.23
      //    5 - 5.98
      
      hArray.ShiftUp(3);
      // Получаем:
      //    0 - 7
      //    1 - 32.5
      //    2 - 89
      //    3 - Не определено
      //    4 - 587
      //    5 - 2.23
      //    6 - 5.98
    • SwapAt - Меняет указанные элементы ArrayList местами.
      PHP:
      // Имеем ArrayList:
      //    0 - 7
      //    1 - 32.5
      //    2 - 587
      //    3 - 2.23
      
      hArray.SwapAt(1, 3);
      // Получаем:
      //    0 - 7
      //    1 - 2.23
      //    2 - 587
      //    3 - 32.5
    • FindValue - Получает индекс элемента ArrayList по его значению. Возвращает -1 если элемент не найден.
      Используется для поиска элементов по значению
      PHP:
      // Имеем ArrayList:
      //    0 - 7
      //    1 - 32.5
      //    2 - 587
      //    3 - 2.23
      int index = hArray.FindValue(587);
      // index = 2
    • FindString - Получает индекс элемента ArrayList по его значению (char). Возвращает -1 если элемент не найден.
      Используется для поиска элементов по значению
      PHP:
      // Имеем ArrayList:
      //    0 - "my string 1"
      //    1 - "my string 2"
      //    2 - "my string 3"
      //    3 - "my string 4"
      int index = hArray.FindString("my string 2");
      // index = 1
  • Свойства ArrayList
    • Length - Получает текущий размер ArrayList
      PHP:
      // Имеем ArrayList:
      //    0 - 7
      //    1 - 32.5
      //    2 - 587
      //    3 - 2.23
      int iSize = hArray.Length;
      // iSize = 4
PHP:
ArrayList g_hGlobalArray;

public void OnPluginStart()
{
    g_hGlobalArray = new ArrayList(ByteCountToCells(64));

    g_hGlobalArray.PushString("dfsknj234"); // Индекс 0
    g_hGlobalArray.PushString("d2knj234"); // Индекс 1
    g_hGlobalArray.PushString("564sdf"); // Индекс 2

    g_hGlobalArray.Resize(g_hGlobalArray.Length+2); // Добавляем в конец 2 пустых элемента

    g_hGlobalArray.SetString(3, "sdf812");
    g_hGlobalArray.SetString(4, "bvn78se");

    g_hGlobalArray.ShiftUp(3); // Сдвинем всё начиная с 3-го индекса вверх.

    g_hGlobalArray.SetString(3, "fdg5641234");

    int i, iSize;
    char szBuffer[64];
    iSize = g_hGlobalArray.Length;
    PrintToServer("Size(GlobalArray) = %i", iSize);
    for(i = 0; i < iSize; ++i)
    {
        g_hGlobalArray.GetString(i, szBuffer, sizeof(szBuffer));
        PrintToServer("GlobalArray[%i] = '%s'", i, szBuffer);
    }

    ArrayList hLocalArray = new ArrayList(1, 4);
    hLocalArray.Set(0, 10923);
    hLocalArray.Set(1, 13519);
    hLocalArray.Set(2, 1930);
    hLocalArray.Set(3, 10878);
    hLocalArray.Push(3052);
    hLocalArray.Push(2060);
    hLocalArray.Push(15731);
    hLocalArray.Push(10282);

    hLocalArray.SwapAt(4, 6);

    i = hLocalArray.FindValue(1930);
    if(i != -1)
    {
        hLocalArray.Set(3, 345);
    }

    iSize = hLocalArray.Length;
    PrintToServer("Size(hLocalArray) = %i", iSize);
    for(i = 0; i < iSize; ++i)
    {
        PrintToServer("hLocalArray[%i] = %i", i, hLocalArray.Get(i));
    }

    delete hLocalArray;

    hLocalArray = new ArrayList(3);
    hLocalArray.PushArray({34, 345, 13}, 3);
    hLocalArray.PushArray({21, 28, 0}, 3);
    hLocalArray.PushArray({86, 43, 799}, 3);

    hLocalArray.Set(1, 172, 2, false); // В массиве {21, 28, 0} заменяем 0 на 172

    int iArray[3];
    iSize = hLocalArray.Length;
    PrintToServer("Size(hLocalArray2) = %i", iSize);
    for(i = 0; i < iSize; ++i)
    {
        hLocalArray.GetArray(i, iArray, 3);
        PrintToServer("hLocalArray2[%i] = {%i, %i, %i}", i, iArray[0], iArray[1], iArray[2]);
    }

    delete hLocalArray;
}
Результаты:
PHP:
Size(GlobalArray) = 6
GlobalArray[0] = 'dfsknj234'
GlobalArray[1] = 'd2knj234'
GlobalArray[2] = '564sdf'
GlobalArray[3] = 'fdg5641234'
GlobalArray[4] = 'sdf812'
GlobalArray[5] = 'bvn78se'

Size(hLocalArray) = 8
hLocalArray[0] = 10923
hLocalArray[1] = 13519
hLocalArray[2] = 345
hLocalArray[3] = 10878
hLocalArray[4] = 15731
hLocalArray[5] = 2060
hLocalArray[6] = 3052
hLocalArray[7] = 10282

Size(hLocalArray2) = 3
hLocalArray2[0] = {34, 345, 13}
hLocalArray2[1] = {21, 28, 172}
hLocalArray2[2] = {86, 43, 799}

<= К содержанию
 
Последнее редактирование:
Сверху Снизу