3986

Знайомство з динамічними масивами

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота №6 (Знайомство з динамічними масивами) Тема роботи: Знайомство з динамічними масивами. Мета роботи: Навчитися писати програми з використанням динамічних масивів. План роботи. Ознайомитися з інтерфейсами та їх влас...

Украинкский

2012-11-10

273.57 KB

14 чел.

6.

Лабораторна робота №6 (Знайомство з динамічними масивами)

Тема роботи: Знайомство з динамічними масивами.

Мета роботи: Навчитися писати програми з використанням динамічних масивів.

План роботи

1.

2.

3.

4.

5.

Ознайомитися з інтерфейсами та їх властивостями: Collection, List, Set.

Ознайомитися з класами: ArrayList, HeshSet, TreeSet.

Модифікувати програми для класів ArrayList, HeshSet, TreeSet згідно свого варіанту

Ознайомлення з колекціями класів, визначених програмістом.

Доробити програму з колекціями класів, визначених програмістом.

Теоретичні відомості

В Java 2 було запропоновано одне із найбільш цікавих доповнень – колекції. Структура

колекцій стандартизує спосіб, з допомогою якого ваші програми обробляють групи об’єктів. В

попередніх версіях Java для збереження і маніпулювання даними служили класи Dictionary,

Vector, Stack і Properties. Хоча ці класи були досить корисними, відчувалась нестача

уніфікованого, централізованого підходу при роботі з групами об’єктів. Наприклад, спосіб

використання класу Vector відрізнявся від використання класу Properties.

Інтерфейси колекцій

Нагадаємо, інтерфейс – це набір функцій, котрі повинні бути реалізовані (визначені) в класі.

Інтерфейс Collection.

Інтерфейс Collection – основа, на якій формується структура колекцій. В ньому

оголошуються методи, котрі визначаються всіма колекціями.

Основні методи колекцій:

boolean add(Object obj)

Додає obj до колекції. Повертає true, якщо obj був доданий до

колекції, і false якщо obj уже був доданий до колекції і якщо

колекція не допускає дублікатів

void clear()

Видаляє всі елементи із колекції

boolean contains(Object obj)

Повертає true, якщо колекція містить obj, false – якщо ні

Iterator iterator()

Повертає ітератор (iterator) для колекції

boolean remove(Object obj)

Видаляє один екземпляр obj із колекції. Повертає true якщо

елемент був видалений і false - якщо ні

int size()

Повертає кількість елементів, котрі містяться в колекції

Object toArray()

Повертає масив, котрий містить всі елементи колекції

Об’єкти додаються в колекцію з допомогою методу add(). Зверніть увагу, що add() отримує

аргумент типу Object. Оскільки Object – суперклас для всіх класів, в колекції можна зберігати

об’єкт будь-якого типу. Однак, примітивні типи зберігати не можна.

Для видалення об’єктів служить метод remove().

58


Інтерфейс List.

Цей інтерфейс доповнює Collection і визначає поведінку колекції, котра зберігає

послідовність елементів. Елементи можуть бути вставлені або отримані із колекції з допомогою

їх позиції в списку, котра відраховується від нуля.

Методи інтерфейсу List.

void add(int index, Object obj)

Object get(int index)

int indexOf(Object obj)

Object remove(int index)

Object set(int index)

Вставляє obj в колекцію в позицію з індексом

index. Будь-які елементи, котрі існували раніше в

точці вставки або вище неї будуть зсунуті (тобто

елементи не перезаписуються поверх існуючих)

Повертає об’єкт, котрий зберігається в позиції

index

Повертає індекс першого екземпляру obj.

Якщо obj не знайдено – повертається -1

Видаляє елемент із позиції index. В результаті

список ущільнюється (тобто, індекси наступних

елементів зменшуються на 1)

Встановлює об’єкт obj в позиції під номером

index

Інтерфейс Set.

Цей інтерфейс повторює інтерфейс Collection і оголошує поведінку колекції, котра не

допускає дублювання елементів. Тому метод add() повертає false, якщо здійснюється спроба

додати в набір дублюючі елементи.

Класи колекцій

Це класи – котрі реалізують вищезгадані інтерфейси, тобто реалізовують всі методи.

Клас ArrayList.

Цей клас реалізує інтерфейс List. ArrayList підтримує динамічні масиви, котрі можуть рости

по мірі необхідності. В Java стандартні масиви мають фіксовану довжину. Після того, як масиви

створені, вони не можуть розширюватись або зменшуватись, це означає, що ви наперед повинні

знати, скільки елементів буде знаходитись у масиві. Але, інколи, ви не можете до моменту

виконання точного розміру масиву. Саме для цього і служить клас ArrayList.

Приклад 1.

import java.util.ArrayList;

public class Lab2

{

public static void main(String[] args)

{

//створюємо динамічний масив

ArrayList al = new ArrayList();

System.out.println("Starting size of al: "+al.size());

//додаємо елементи в масив

59


al.add("C");

al.add("A");

al.add("B");

al.add("D");

al.add("C");

al.add("F");

al.add(1,"A2");

System.out.println("Size of al after add : "+al.size());

//показати на екрані список масиву

System.out.println("al consists of : "+al);

//видалити елементи із списку

al.remove("F");

al.remove(2);

System.out.println("Size of al after removing : "+al.size());

//показати на екрані список масиву

System.out.println("al consists of after removing : "+al);

}

}

Клас HashSet.

Цей клас реалізує інтерфейс Set. Він створює колекцію, котра використовує хеш-таблицю

для збереження колекції. Перевага використання такої таблиці в тому, що для великих масивів

зберігається постійним час виконання основних операцій, таких, як add(), remove(), size().

Важливо відмітити, що такий клас не гарантує впорядковування елементів.

Приклад 2.

import java.util.HashSet;

public class Lab2

{

public static void main(String[] args)

{

//створюємо динамічний масив

HashSet hs = new HashSet();

//додаємо елементи в масив

hs.add("C");

hs.add("A");

hs.add("B");

hs.add("D");

hs.add("C");

hs.add("F");

//показати на екрані список масиву

System.out.println("hs consists of : "+hs);

}

}

60


Клас TreeSet.

Цей клас теж реалізує інтерфейс Set, але на відміну від класу HasSet, об’єкти в ньому

зберігаються в відсортованому вигляді.

Приклад 3.

import java.util.TreeSet;

public class Lab2

{

public static void main(String[] args)

{

//створюємо динамічний масив

TreeSet ts = new TreeSet();

//додаємо елементи в масив

ts.add("C");

ts.add("A");

ts.add("B");

ts.add("D");

ts.add("C");

ts.add("F");

//показати на екрані список масиву

System.out.println("ts consists of : "+ts);

}

}

Колекції класів, визначених програмістом.

Для простоти в попередніх прикладах ми зберігали у колекціях вбудовані об’єкти типу

String. Однак, колекції не обмежуються збереженням простих типів. Потужність колекцій якраз в

тому і полягає, щоб зберігати будь-який тип об’єкта, в тому числі і створеного вами.

Приклад 4.

import java.util.*;

public class Lab2

{

public static void main(String[] args)

{

//створюємо динамічний масив

HashSet hs = new HashSet();

//додаємо елементи в масив

hs.add(new Address("Antoniv", "23/16 Naukova Str., Lviv"));

hs.add(new Address("Kozak", "12 Konovaltsa Str., Lviv"));

hs.add(new Address("Hrabovskyy", "21 Shevchenka Str., Lviv"));

hs.add(new Address("Hrabovskyy", "21 Chereshneva Str., Lviv"));

//показати на екрані список масиву

Iterator iterator = hs.iterator();

while(iterator.hasNext())

{

System.out.println(iterator.next()+"\n");

}

}

static class Address

{

private String name;

61


private String address;

public Address(String name, String address)

{

this.name = name;

this.address = address;

}

public int hashCode()

{

return name.hashCode();

}

public String toString()

{

return name+"\n"+address;

}

}

}

Зверніть увагу, що в визначеному нами класі Address задається метод hashCode(), котрий

повертає тип int. Цей метод повинен повертати унікальне значення для кожного об’єкту. При

цьому, якщо значення hashCode() співпадають, то об’єкти вважаються однаковими. Саме

звертаючись до цього методу клас HashSet визначає, чи такий об’єкт уже існує в наборі.

Порядок виконання роботи

1.

Виконайте всі наведені приклади.

2.

До масиву ArrayList() добавити об'єкти A, C, D, R, T та пояснити результат( в низу

програми в коментарях.

3.

До масиву HashSet() добавити об'єкти A, C, D, R, T та пояснити результат( в низу

програми в коментарях.

4.

До масиву TreeSet() добавити об'єкти A, C, D, R, T та пояснити результат( в низу

програми в коментарях.

5.

Поясніть чому в прикладі 4 об’єкт new Address("Hrabovskyy", "21 Chereshneva Str.,

Lviv") не буде доданий до набору.

6.

Видрукуйте всі елементи на екрані, користуючись методами size(), get(index) з

допомогою циклу for.

7. Зробіть висновки. Оформити звіт. У звіті повинно бути текст програми і скріншоти результатів.

8. Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм [Ваша

Фамілія]_labN_k.class ,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb, де N – номер

лабораторної роботи, k – номер програми.

Контрольні питання

1. Який клас дозволяє дублювання елементів в колекції?

2. Який клас створює колекцію, котра використовує хеш-таблицю для збереження колекції.

Перевага використання такої таблиці в тому, що для великих масивів зберігається постійним час

виконання основних операцій, таких, як add(), remove(), size().

3. Скільки об'єктів можна створити з одного класу?

4. Чи можна добавити об'єкт у масив ArrayList у визначену позицію?

5. Який масив впорядковує елементи колекції?

6. Які методи інтерфейс Collection успадковує від інтерфейсу List, а які перевизначає?

62