Академия современного программирования

При создании таких игр как "Змейка" или "Морской бой" было удобно использовать двумерный массив для хранения данных игрового поля. Но использование только массивов будет не очень удобным при создании игры "Пасьянс-Косынка". В играх "Змейка", "Морской бой" размеры игровых полей были фиксированного размера и не изменялись во время игры. Массив удобен для хранения, изменения и использования фиксированного набора значений. В игре "Пасьянс-Косынка" нам понадобится хранить наборы значений,количество которых можно увеличивать или уменьшать. В этом нам поможет список значений,который в языке Javaможно реализовать с помощью классаArrayList:

//Подключаем класс ArrayList

import java.util.ArrayList;

Рассмотрим примеры работы со списком на примере списка целых чисел.

Прежде всего, создадим пустой список значений целых чисел:

// Подключаем классArrayList

import java.util.ArrayList;

public class kosinka {

public static void main(String args) {

//Создаем пустой список значений целых чисел

ArrayList lst = new ArrayList();

Внутри угловых скобок указывается тип элементов списка ,Integer –это целое число. Значения элементов списка могут быть любого типа. Создание, например,списка кнопок JButton выглядит так:

ArrayList lst = new ArrayList();

Но сейчас мы будем рассматривать список целых чисел. Работа со списками разных типов значений происходит по одинаковой схеме.

Изначально список пустой:

ArrayList lst = new ArrayList();

Добавим в него три новых элемента с помощью метода add():

// Создаем пустой список значений целых чисел

ArrayList lst = new ArrayList();

//Добавим первый элемент в список

//Добавим второй элемент в список

//Добавим третий элемент в список

Добавление элементов происходит в конец списка (см. рис. 10).

Теперь рассмотрим основные приемы работы со списком:

// Получаем количество элементов в списке

// В данном случае – три (см. рис. 10)

int kol = lst.size();

// Получение значения элемента по номеру

// В данном случае – 100 (см. рис. 10)

int val = lst.get(0);

// Удаление элемента из списка по номеру

// В данном случае – самый верхний (см. рис. 10)

// Удаление всех элементов из списка

С помощью метода size()можно определить количество элементов в списке.

Метод get()позволяет получить значение любого элемента по номеру, нумерация начинается с нуля. Метод remove()удаляет элемент из списка по его номеру, нумерация начинается с нуля.После удаления элемента список автоматически сжимается. Метод clear() позволяет удалить сразу все элементы из списка. Также как и в массиве, каждый элемент списка имеет свой номер. Самый первый элемент списка имеет номер нуль 0, а самый последний элемент имеет номер size()-1. Этих методов работы со списком будет достаточно при создании игры "Пасьянс-Косынка". На игровом поле будут находиться карты,разложенные в несколько стопок.Пользователь будет переносить карты из одной стопки в другую. Карты будут добавляться в конец стопки карт. Поэтому всех перечисленных выше методов будет достаточно.

12 сентября 2011 в 18:19

Структуры данных в картинках. ArrayList

  • Java

Приветствую вас, хабралюди!

Взбрело мне в голову написать несколько статей, о том как реализованы некоторые структуры данных в Java. Надеюсь, статьи будут полезны визуалам (картинки наше всё), начинающим java-визуалам а также тем кто уже умеет писать new ArrayList(), но слабо представляет что же происходит внутри.

Сегодня поговорим о ArrayList-ах

ArrayList - реализует интерфейс List. Как известно, в Java массивы имеют фиксированную длину, и после того как массив создан, он не может расти или уменьшаться. ArrayList может менять свой размер во время исполнения программы, при этом не обязательно указывать размерность при создании объекта. Элементы ArrayList могут быть абсолютно любых типов в том числе и null.

Создание объекта

ArrayList list = new ArrayList();
Только что созданный объект list, содержит свойства elementData и size .

Хранилище значений elementData есть ни что иное как массив определенного типа (указанного в generic), в нашем случае String . Если вызывается конструктор без параметров, то по умолчанию будет создан массив из 10-ти элементов типа Object (с приведением к типу, разумеется).

Внутри метода add(value) происходят следующие вещи:

EnsureCapacity(size + 1);
2) добавляется элемент в конец (согласно значению size ) массива.

ElementData = element;
Весь метод ensureCapacity(minCapacity) рассматривать не будем, остановимся только на паре интересных мест. Если места в массиве не достаточно, новая емкость рассчитывается по формуле (oldCapacity * 3) / 2 + 1 . Второй момент это копирование элементов. Оно осуществляется с помощью native метода System.arraycopy() , который написан не на Java.

// newCapacity - новое значение емкости elementData = (E)new Object; // oldData - временное хранилище текущего массива с данными System.arraycopy(oldData, 0, elementData, 0, size);

Ниже продемонстрирован цикл, поочередно добавляющий 15 элементов:
list.add("1");


...

List.add("10");
При добавлении 11-го элемента, проверка показывает что места в массиве нет. Соответственно создается новый массив и вызывается System.arraycopy() .

Добавление в «середину» списка

list.add(5, "100");
Добавление элемента на позицию с определенным индексом происходит в три этапа:

1) проверяется, достаточно ли места в массиве для вставки нового элемента;

EnsureCapacity(size+1);
2) подготавливается место для нового элемента с помощью System.arraycopy() ;

System.arraycopy(elementData, index, elementData, index + 1, size - index);


3) перезаписывается значение у элемента с указанным индексом.

Как можно догадаться, в случаях, когда происходит вставка элемента по индексу и при этом в вашем массиве нет свободных мест, то вызов System.arraycopy() случится дважды: первый в ensureCapacity() , второй в самом методе add(index, value) , что явно скажется на скорости всей операции добавления.

В случаях, когда в исходный список необходимо добавить другую коллекцию, да еще и в «середину», стоит использовать метод addAll(index, Collection) . И хотя, данный метод скорее всего вызовет System.arraycopy() три раза, в итоге это будет гораздо быстрее поэлементного добавления.

Удаление элементов

Удалять элементы можно двумя способами:
- по индексу remove(index)
- по значению remove(value)

С удалением элемента по индексу всё достаточно просто

List.remove(5);
Сначала определяется какое количество элементов надо скопировать

Int numMoved = size - index - 1;
затем копируем элементы используя System.arraycopy()

System.arraycopy(elementData, index + 1, elementData, index, numMoved);
уменьшаем размер массива и забываем про последний элемент

ElementData[--size] = null; // Let gc do its work

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

Дополнение 1: Как верно заметил

What is ArrayList in Java?

ArrayList is a data structure that can be stretched to accommodate additional elements within itself and shrink back to a smaller size when elements are removed. It is a very important data structure useful in handling the dynamic behavior of elements.

Wondering how ArrayList java could be useful, see the below conversation -

See the following picture of a man stretching an elastic rubber band.

The actual length of the rubber band is much smaller, but when stretched it can extend a lot more than its actual length and can be used to hold/bind much larger objects with it.

Now, consider the next picture, that of a simple rope, it cannot stretch and will have a fixed length.

It can grow as, and when required to accommodate the elements it needs to store and when elements are removed, it can shrink back to a smaller size.

So as our friend has an issue with the array he is using cannot be expanded or made to shrink, we will be using ArrayList.

Arrays are like the rope shown in the above picture; they will have a fixed length, cannot be expanded nor reduced from the original length.

So our stretchable rubber-band is much like the Array List whereas the rope can be considered as the array.

Technically speaking, java Array List is like a dynamic array or a variable-length array.

Let us see and understand the following code snippet that will help you work around with Array List.

ArrayList a = new ArrayList();

ArrayList Methods

    ArrayList add : This is used to add elements to the Array List. If an ArrayList already contains elements, the new element gets added after the last element unless the index is specified.

    Add(Object o);

    ArrayList remove : The specified element is removed from the list and the size is reduced accordingly. Alternately, you can also specify the index of the element to be removed.

    Remove(Object o);

    Java array size : This will give you the number of elements in the Array List. Just like arrays, here too the first element starts with index 0.

    Int size();

    ArrayList contains : This method will return true if the list contains the specified element.

    Boolean contains(Object o);

Java ArrayList Example

import java.util.ArrayList; class Test_ArrayList { public static void main(String args) { //Creating a generic ArrayList ArrayList arlTest = new ArrayList(); //Size of arrayList System.out.println("Size of ArrayList at creation: " + arlTest.size()); //Lets add some elements to it arlTest.add("D"); arlTest.add("U"); arlTest.add("K"); arlTest.add("E"); //Recheck the size after adding elements System.out.println("Size of ArrayList after adding elements: " + arlTest.size()); //Display all contents of ArrayList System.out.println("List of all elements: " + arlTest); //Remove some elements from the list arlTest.remove("D"); System.out.println("See contents after removing one element: " + arlTest); //Remove element by index arlTest.remove(2); System.out.println("See contents after removing element by index: " + arlTest); //Check size after removing elements System.out.println("Size of arrayList after removing elements: " + arlTest.size()); System.out.println("List of all elements after removing elements: " + arlTest); //Check if the list contains "K" System.out.println(arlTest.contains("K")); } }

Size of ArrayList at creation: 0 Size of ArrayList after adding elements: 4 List of all elements: See contents after removing one element: See contents after removing element by index: Size of arrayList after removing elements: 2 List of all elements after removing elements: true

Note: For simplicity, the elements shown in above code are single character elements. We can add Strings, integers, etc. too.



 Top