Назад Зміст Вперед

4.4. Інтерфейси List, Set, Queue. Класи, що реалізують ці інтерфейси

У елементів списку (List) є чітко заданий порядок, тому їх можна вивести просто за номером.У Set і Map строго заданого порядку елементів немає. Власне кажучи, порядок їх елементів може змінюватися при видаленні або додаванні якогось елементу.

Тому для роботи з елементами колекцій були придумані спеціальні об'єкти - ітератори. З їх допомогою можна пройтися по всіх елементах колекції, навіть якщо у них немає номера, а тільки імена (Map), або взагалі немає імен - Set.

операція
метод
Додавати елемент (и)
add (), addAll ()
Видаляти елемент (и)
remove (), removeAll ()
Перевіряти, чи є елемент (и)
contains (), containsAll ()

Set - це множина - купа ненумерованих об'єктів. Головна особливість Set - в ньому тільки унікальні об'єкти, тобто вони всі різні. 
Можна дізнатися кількість елементів за допомогою методу size ().
Інтерфейс Set не містить нових методів, тільки успадковані.
У інтерфейсу 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 );
    }
}

Вивід на екран елементів List
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 < >
{
 data ; LinkedListElement < next ; 
LinkedListElement < 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.

.