Главная » Processing » Работа с ArrayList в Processing

0

В примере Работа с массивами мы научились работать с массивами, но работа с маивами имеет свои ограничения. Вы не можете просто добавлять или удалять объекты. Структура данных ArrayList работает аналогично обычным массивам объектов, но добавлять и удалять объекты в этом случае проще.

Как это делается

Начните с сохранения вашего скетча по именем working_with_arraylists.pde. Следующее, что нужно сделать – добавить новую вкладку и сохранить ее как MyObject. Это делается нажатием кнопки со стрелкой в верхней части PDE или сочетанием клавиш Shift + Cmd + N на Mac или Shift + Ctrl + N на Windows и Linux.

В этой вкладке мы напишем небольшой класс с двумя методами. Этот класс мы испольем для создания объектов нашего ArrayList.

class MyObject

{

float x; float y;

MyObject()

{

x = random( width ); y = random( height );

}

void update()

{

y–;

}

void render()

{

ellipse( x, y, 60, 60 );

}

}

Когда вы напишете код для класса MyObject вы можете переключиться на вкладку

working_ with_arraylists в функции setup().

ArrayList<MyObject> myList;

void setup()

{

size( 640, 480 );

smooth();

myList = new ArrayList<MyObject>(); for ( int i = 0; i < 4; i++ ) {

myList.add( new MyObject() );

}

}

В функции draw() мы переберем все объекты в обратном порядке, обновим их и нисуем на экране. Перебирать объекты нужно в обратном порядке, так как нам нужно удалять объекты динамически.

void draw()

{

background( 255 );

fill( 255, 128 );

stroke( 0 );

for ( int i = myList.size() – 1; i >= 0; i– ) { MyObject o = (MyObject)myList.get( i ); o.update();

o.render();

if ( o.y <= 0 ) { myList.remove( i );

}

}

}

Последнее, что нужно сделать – добавить функцию mousePressed(). К списку будет бодавлен новый объект, а при нажатии на кнопку мыши на консоль будет выведено число элементов.

void mousePressed()

{

myList.add( new MyObject() );

println( "Total elements in List: " + myList.size() );

}

Когда вы запустите скетч, вы увидите следующее изображение:

Как это работает

Первое, что нужно сделать – объявить ArrayList перед функцией setup(). Это делается с помощью следующего кода:

ArrayList myList;

Также в можете добавить к списку тип данных, если уже знаете, какие объекты будете сохранять там. В этом примере я добавил тип данных MyObject.

ArrayList<MyObject> myList;

В функции setup() теперь нужно создать пустой ArrayList. Далее я показал, как сделать это с указанием или без указания типа данных.

myList = new ArrayList(); // without datatype

myList = new ArrayList<MyObject>(); // with datatype

С помощью метода add() вы можете добавить элементы к массиву. В этом примере я использовал обычный цикл for для добавления объектов. Для добавления одного объекта нужно ввести следующую строку кода:

myList.add( new MyObject() );

С помощью метода remove() вы можете удалить объекты из списка. Для этого в метод нужно ввести номер удаляемого элемента. Для удаления первого элемента вызовите метод myList.remove( 0 ).

Дополнительно

Существуют и другие способы доступа к элементам ArrayList. Если вы добавили тип данных к ArrayList примерно так, как в функции setup(), (myList = new ArrayList<MyObject>();), можно использовать эту упрощенную форму для цикла for. Вам больше не нужно задумываться о типе данных элемента. Этот прием работает также если вы хотите получить доступ к массиву объектов.

for ( MyObject o : myList ) { o.update();

o.render();

}

Другой способ работы с ArrayList – итератор. Получить доступ к итератору можно вызвав метод iterator() в своем ArrayList. Метод hasNext() в итераторе возвращает истину (true), если элементы дальше еще есть, и ложь (false), если этот элемент – последний. Метод next() в итераторе используется для получения следующего объекта в списке.

Iterator itr = myList.iterator(); while ( itr.hasNext() ) {

MyObject o = (MyObject)itr.next(); o.update();

o.render();

}

Источник: Ян Вантомм, Processing 2: креативное программирование, перевод с английского Александры Мишутиной, Published by Packt Publishing Ltd., 2012, BIRMINGHAM – MUMBAI.

По теме:

  • Комментарии