У елементів списку (List) є чітко заданий порядок, тому їх можна вивести просто за номером.У Set і Map строго заданого порядку елементів немає. Власне кажучи, порядок їх елементів може змінюватися при видаленні або додаванні якогось елементу.
Тому для роботи з елементами колекцій були придумані спеціальні об'єкти - ітератори. З їх допомогою можна пройтися по всіх елементах колекції, навіть якщо у них немає номера, а тільки імена (Map), або взагалі немає імен - Set.
операція
|
метод
|
Додавати елемент (и)
|
add (), addAll ()
|
Видаляти елемент (и)
|
remove (), removeAll ()
|
Перевіряти, чи є елемент (и)
|
contains (), containsAll ()
|
Set - це множина - купа ненумерованих об'єктів. Головна особливість Set - в ньому тільки унікальні об'єкти, тобто вони всі різні.
Можна дізнатися кількість елементів за допомогою методу size ().
Інтерфейс Set не містить нових методів, тільки успадковані.
У інтерфейсу Set є два інтерфейси-спадкоємця з методами: SortedSet і NavigableSet.
Можна дізнатися кількість елементів за допомогою методу size ().
У інтерфейсу Set є два інтерфейси-спадкоємця з методами: SortedSet і NavigableSet.
Методи інтерфейсу List <E> :
методи
|
опис
|
void add (int index, E
element);
|
Додає
елементи в середину колекції
|
boolean addAll (int index,
Collection <? extends E> c);
|
Додає
елементи в колекцію
|
E get (int index);
|
Повертає
елемент по номеру
|
int indexOf (Object o);
|
Повертає
індекс (номер) елемента
|
int lastIndexOf (Object o);
|
Повертає
останній індекс елемента.
|
ListIterator <E> listIterator ();
|
Повертає
ітератор для списку
|
ListIterator <E>
listIterator (int index);
|
Повертає
ітератор для списку
|
E remove (int index);
|
Видаляє
елемент за індексом
|
E set (int index, E
element);
|
Встановлює
нове значення за індексом
|
List <E> subList
(int fromIndex, int toIndex);
|
Повертає
під-колекцію
|
Методи інтерфейсу Set <E> :
методи
|
опис
|
немає методів |
Реалізації інтерфейсу List
Основна перевага такої колекції над масивом - це розширюваність - збільшення довжини при потребі. Якщо в цьому масиві закінчується місце, то створюється другий масив більший, куди копіюються всі елементи з першого. Потім другий масив займає місце першого, а перший - викидається (буде знищений складальником сміття).
Довжина нового масиву розраховується так (3 * n) / 2 + 1, де n - це довжина старого масиву. Тобто, якщо старий масив був довжиною 100 елементів, то новий буде 300/2 + 1 = 151.
При додаванні елемента в середину ArrayList, всі елементи праворуч від нього копіюються на 1 позицію вправо, а потім всередину додається новий елемент.При видаленні елемента з середини, всі елементи праворуч від нього копіюються на 1 позицію вліво.Можна змусити ArrayList зменшити свій внутрішній масив до мінімального рівня, якщо викликати метод trimToSize ().
Вивід на екран елементів Set
| |
public static void main (String [] args)
{
Set <String> set = new HashSet <String> ();
set.add ( "Mama");
set.add ( "Mila");
set.add ( "Ramu");
// отримання ітератора для безлічі
Iterator <String> iterator = set .iterator ();
while ( iterator.hasNext ()) // перевірка, чи є ще елементи
{
// отримання поточного елемента і перехід на наступний
String text = iterator.next ();
System.out.println ( text );
}
}
|
Вивід на екран елементів
| |
public static void main (String [] args)
{
List <String> list = new ArrayList <String> ();
list.add ( "Mama");
list.add ( "Mila");
list.add ( "Ramu");
Iterator <String> iterator = list .iterator (); // отримання ітератора для списку
while ( iterator.hasNext ()) // перевірка, чи є ще елементи
{
// отримання поточного елемента і перехід на наступний
String text = iterator.next ();
System.out.println ( text );
}
}
|
Колекція ArrayList.
Усередині ArrayList зберігає елементи в простому масиві.
LinkedList.
Клас елементів для зберігання рядків:
приклад
опис
class LinkedListElement
{
String data ;
LinkedListElement next ;
LinkedListElement previous; }
data зберігає рядкове значення елемента.
next зберігає посилання на наступний елемент у списку.
previous зберігає посилання на попередній елемент у списку.
А якщо використовувати generics для типу даних, то буде:
Клас елемента зв'язного списку з generic'ом
class LinkedListElement < T >
{ T data ; LinkedListElement < T > next ;
LinkedListElement < T > previous ; }
Приклад двозв’язного списку з 10 елементів:
public static void main (String [] args)
{ LinkedListElement <Integer> tail ;
// хвіст (самий останній елемент) списку
for (int i = 0; i <10; i ++) {
LinkedListElement <Integer> element = new LinkedListElement <Integer > ();
element .data = i; if ( tail == null)
// якщо в хвості немає елементів, зробити наш елемент останнім
{ tail = element;
} else
// якщо хвіст є, додати елемент
{ tail .next = element;
// додаємо хвоста посилання на наступний елемент
element .previous = tail ; // додаємо новому елементу посилання на хвіст
tail = element;
// оголошуємо новий елемент хвостом.
}
}
}
Припустимо в списку 10 елементів, ось як вставити елемент всередину:
Яскраво червоним виділені посилання, які помінялися - вони тепер вказують на новий елемент.
Яскраво фіолетовим виділені нові посилання - посилання нового
елемента на його сусідів.
// тут міститься елемент - голова списку
LinkedListElement <Integer> head = ...
// отримуємо 4-й елемент (нумерація з нуля)
LinkedListElement <Integer> element4=head.next.next.next.next;
// отримуємо 5-й елемент
LinkedListElement <Integer> element5 =element4.next;
// Створюємо новий елемент, який будемо вставляти
LinkedListElement <Integer> newElement=new LinkedListElement <Integer> ();
newElement.data = -18;
// обмінюємося посиланнями з елементом зліва
newElement.previous = element4;
element4.next = newElement;
// обмінюємося посиланнями з елементом праворуч
newElement.next =element5 ; element5.previous = newElement;
Завдання на Set
1. 20 слів на букву «Л». Створити множину рядків ( Set <String> ), занести в неї 20 слів на букву «Л».
2. Видалити всі числа більше 10. Створити множину чисел ( Set <Integer> ), занести туди 20 різних чисел. Видалити з множини всі числа більше 10.
Клас елементів для зберігання рядків:
приклад
|
опис
|
class LinkedListElement
{ String data ; LinkedListElement next ; LinkedListElement previous; } |
data зберігає рядкове значення елемента.
next зберігає посилання на наступний елемент у списку.
previous зберігає посилання на попередній елемент у списку.
|
А якщо використовувати generics для типу даних, то буде:
Клас елемента зв'язного списку з generic'ом
|
class LinkedListElement < T >
{ T data ; LinkedListElement < T > next ;
LinkedListElement < T > previous ; }
|
Приклад двозв’язного списку з 10 елементів:
public static void main (String [] args)
{ LinkedListElement <Integer> tail ;
{ LinkedListElement <Integer> tail ;
// хвіст (самий останній елемент) списку
for (int i = 0; i <10; i ++) {
LinkedListElement <Integer> element = new LinkedListElement <Integer > ();
element .data = i; if ( tail == null)
// якщо в хвості немає елементів, зробити наш елемент останнім
{ tail = element;
} else
// якщо хвіст є, додати елемент
{ tail .next = element;
// додаємо хвоста посилання на наступний елемент
element .previous = tail ; // додаємо новому елементу посилання на хвіст
tail = element;
// оголошуємо новий елемент хвостом.
}
}
}
Припустимо в списку 10 елементів, ось як вставити елемент всередину:
Яскраво червоним виділені посилання, які помінялися - вони тепер вказують на новий елемент.
Яскраво фіолетовим виділені нові посилання - посилання нового елемента на його сусідів.
// тут міститься елемент - голова списку
Яскраво фіолетовим виділені нові посилання - посилання нового елемента на його сусідів.
// тут міститься елемент - голова списку
LinkedListElement <Integer> head = ...
// отримуємо 4-й елемент (нумерація з нуля)
LinkedListElement <Integer> element4=head.next.next.next.next;
// отримуємо 5-й елемент
LinkedListElement <Integer> element5 =element4.next;
// Створюємо новий елемент, який будемо вставляти
LinkedListElement <Integer> newElement=new LinkedListElement <Integer> ();
newElement.data = -18;
// обмінюємося посиланнями з елементом зліва
newElement.previous = element4;
element4.next = newElement;
// обмінюємося посиланнями з елементом праворуч
newElement.next =element5 ; element5.previous = newElement;
// отримуємо 4-й елемент (нумерація з нуля)
LinkedListElement <Integer> element4=head.next.next.next.next;
// отримуємо 5-й елемент
LinkedListElement <Integer> element5 =element4.next;
// Створюємо новий елемент, який будемо вставляти
LinkedListElement <Integer> newElement=new LinkedListElement <Integer> ();
newElement.data = -18;
// обмінюємося посиланнями з елементом зліва
newElement.previous = element4;
element4.next = newElement;
// обмінюємося посиланнями з елементом праворуч
newElement.next =element5 ; element5.previous = newElement;
Завдання на Set
1. 20 слів на букву «Л». Створити множину рядків ( Set <String> ), занести в неї 20 слів на букву «Л».
2. Видалити всі числа більше 10. Створити множину чисел ( Set <Integer> ), занести туди 20 різних чисел. Видалити з множини всі числа більше 10.