Колекције у програмском језику...

Preview:

Citation preview

1

Колекције

у програмском језику Јава

Предавач: Дражен Драшковић

Контакт: draskovic@etf.bg.ac.rs

Електротехнички факултет

у Београду

2

Колекције - Collection

• У уграђеном Јавином пакету java.util налази се

много веома корисних класа и интерфејса

• Јавин collections фрејмворк стандардизује начин

на који су групе објеката обрађиване од стране

програма

• Јако ефикасан

• Разне врсте колекција раде на исти начин

• Итератори, који се налазе у оквиру овог

фрејмворка стандардизује начин на који се

приступа објектима колекција

3

Мапе - Maps

• Поред колекција, фрејмворк дефинише и

неколико интерфејса и класа мапа.

Мапе складиште објекте типа кључ / вредност.

• Кључ/вредност је пар који се још зове и улаз мапе

• Кључ мора бити јединствен на нивоу једне мапе

• Мапе нису део колекција, али су уско повезане са њима

• Могуће је претворити мапе у неку од колекција и даље

манипулисати са том колекцијом

• Мапе су врло корисне уколико желите да претражујете

по кључу и да вршите ажурирања и брисања елемената

4

Колекције - хијерархија

Collection

Set List

SortedSet HashSet

TreeSet

ArrayList

LinkedList

LinkedHashSet

5

Колекције - итератор

Iterator

ListIterator

6

Пример - примена итератора

import java.util.*;

class PrimerIteratora{

public static void main(String args[]){

ArrayList<String> lista=new ArrayList<String>(); //nova lista

lista.add("Drazen"); //dodajemo objekte u listu

lista.add("Marko");

lista.add("Uros");

lista.add("Filip");

//prolazak kroz listu sa iteratorom

Iterator itr=lista.iterator();

while(itr.hasNext()){

System.out.println(itr.next());

}

}

}

7

Пример - коришћење foreach

import java.util.*;

class PrimerBezIteratora{

public static void main(String args[]){

ArrayList<String> novalista=new ArrayList<String>();

novalista.add("Drazen");

novalista.add("Filip");

novalista.add("Uros");

novalista.add("Marko");

for(String asistent:novalista)

System.out.println(asistent);

}

}

8

Колекције - Мапе

Map

SortedMap HashMap

TreeMap

9

Колекције - Collection

• Collection је корени интерфејс за колекције.

Обезбеђује разне методе за рад са колекцијама.

• Додаје нови елемент/е у колекцију

boolean add(Object obj)

boolean addAll(Collection c)

• Узима објекат/те из колекције

boolean remove(Object obj)

boolean removeAll(Collection c)

• Враћа итератор за ту колекцију

Iterator iterator( )

• Враћа низ који садржи све објекте колекције, објекти су

копије објеката у који се налазе у колекцији

Object[ ] toArray( )

9

10

Колекције - Collection

• Све методе у интерфејсу манипулишу са

подацима типа Object.

• Како је Object надкласа свих класа у Јави,

било који објекат се може сместити у колекцију.

• Примитивни типови не могу да се сместе у колекције.

10

11

Колекције - Set

• Set - Колекција у којој не постоји могућност

постојања елемената дупликата и чији се

елементи не морају чувати неким одређеним

редоследом

• SortedSet - сет чији су елементи уређени

• HashSet - конретна имплементација неуређеног сета

преко хеш табеле

• TreeSet class - имплементира сет интерфејс користећи

стабло за смештање података

• LinkedHashSet class - имплементација листе објеката

преко повезаних уноса у хеш табелу

11

12

Колекције - List

• List - Колекција чији елеметни представљају

листу елемената, најчешће уређена на неки

начин

• ArrayList - имплементације која представља низове

који могу динамички да расту

• LinkedList - имплементација која представља

уланчану листу

12

13

Пример са листама (1)

import java.util.*;

class Knjiga {

int id;

String naziv, autor, izdavac;

int kolicina;

public Knjiga(int id, String naziv, String autor, String izdavac,

int kolicina) {

this.id = id;

this.naziv = naziv;

this.autor = autor;

this.izdavac = izdavac;

this.kolicina = kolicina;

}

}

13

14

Пример са листама (2)

public class ArrayListExample {

public static void main(String[] args) {

List<Knjiga> lista=new ArrayList<Knjiga>(); //pravimo listu knjiga

Knjiga k1=new Knjiga(101,"Na Drini cuprija","Ivo Andric","SKZ", 8);

Knjiga k2=new Knjiga(102,"Tvrdjava","Mesa Selimovic","Stubovi", 4);

Knjiga k3=new Knjiga(103,"Roman o Londonu","Milos Crnjanski","GecaKon", 6);

//dodavanje knjiga

lista.add(k1);

lista.add(k2);

lista.add(k3);

//foreach petlja

for(Knjiga k:lista){

System.out.println(k.id + “ ” + k.naziv + “ ” + k.autor + “ ” +

k.izdavac + “ ” + k.kolicina);

}

}

}

14

Листа је уређена секвенца елемената

Скуп је неуређен и сваки елемент је

јединствен

15

Поређење: листе и скупови (Set)

15

Сви имплементирају интерфејс List и слично се

употребљавају

Главна разлика у имплементацији и перформансама

ArrayList – имплементира листу као низ чија величина може

да се мења, па можемо дохватати елементе са методама

get/set

LinkedList – имплементира се као двоструко уланчана листа,

њене перформансе у додавању и уклањању елемената су

боље од ArrayList, али су горе у коришћењу get/set метода

Vector – сличан као ArrayList, али је синхронизован. Са друге

стране, ArrayList је бољи избор, ако желимо сигуран програм

са нитима (thread-safe program)

16

ArrayList vs LinkedList vs Vector (1)

16

Vector и ArrayList захтевају простор са повећањем

броја елемената у структури

Vector – удвостручује величину структуре сваки пут

ArrayList – сваки пут повећава структуру за 50% своје

величине

LinkedList имплементира Queue интерфејс који има

већи број метода него ArrayList и Vector

Пример: offer(), peek(), pool() и друге

Подразумевани почетни капацитет ArrayList је веома

мали, па је добра препорука да се та структура

одмах конструише са већим почетним капацитетом.

То може да избегне непотребни трошак за промену

величине структуре.

17

ArrayList vs LinkedList vs Vector (2)

17

18

ArrayList vs LinkedList (3)

ArrayList alst = new ArrayList();

alst.add(3);

alst.add(2);

alst.add(1);

alst.add(4);

alst.add(5);

alst.add(6);

alst.add(6);

Iterator iter1 = alst.iterator();

while(iter1.hasNext()){

System.out.println(iter1.next());

}

LinkedList llst = new LinkedList();

llst.add(3);

llst.add(2);

llst.add(1);

llst.add(4);

llst.add(5);

llst.add(6);

llst.add(6);

Iterator iter2 = llst.iterator();

while(iter2.hasNext()){

System.out.println(iter2.next());

}

Да ли се види разлика у коришћењу?

А у начину рада имплементације?

18

19

ArrayList vs LinkedList – перформансе

ArrayList LinkedList

Дохватање елем.:

get()O(1) O(n)

Дохватање новог:

add()O(1)

O(1)

amortized

Уклањање елемента:

remove()O(n) O(n)

ArrayList LinkedList

1 543 352 85 085 551

13 265 642 9 550 057

199 961 301 85 768 810

LinkedList – бржи за операције add и remove,

али доста спорији у операцији get

Избор шта користити: у зависности од комплексности

структуре

LinkedList одабрати када немамо велики број

приступа елементу и када имамо велики број

операција add / remove

Пример главних операција (time [ns])

19

20

Итератор - Iterator

• Iterator омогућава итерирање кроз колекције

• Враћа да ли постоји следећи елемент за итерирање

boolean hasNext ( )

• Враћа наредни елемент у итерацији

Object next ( )

• Уклања елемент који је итератор вратио као последњи,

користи се после позива методе next()

Object remove ( )

• Умеће објекат у листу испред елемента који ће бити

враћен следећим позивом next()

void add (Object obj)

20

21

Мапе - Maps

• Maps не наслеђује интерфејс као и остале колекције, због разлога што мапе складиште елементе као пар кључ / вредност (улаз)• Враћа да ли мапа има вредност под задатим кључем

boolean containsKey (Object key)

• Враћа да ли мапа садржи одређену вредностboolean containsValue (Object value)

• Враћа вредност која се налази под задатим кључемObject get (Object key)

• Складишти елемент у мапу, преписујући елемент који је можда постојао под тим кључем, уколико кључ није постоја пре тога враћа null у супротном објекат који је био под кључемObject put (Object key, Object value)void putAll (Map map) - убацивање мапе у мапу

21

22

Мапе - Maps

• Методе интерфејса Maps• Уклања објекат који се налази под кључем к

Object remove (Object k)

• Враћа број елемената у мапиint size ( )

• Конкретне имплементације HashMap, TreeMap• HashMap - класа која имплементира мап интерфејс

преко хаш табеле

• TreeMap - класа која имплементира интерфејс помоћу стабла, гарантује сортирање по узлазној вредности кључа, кључеви морају имплементирати Comparableинтерфејс (обезбеђује методу за компарацију)

22

23

Мапе - Пример

import java.util.*;

class MapPrimer{

public static void main(String args[]){

Map<Integer,String> nastavnici =

new HashMap<Integer,String>();

nastavnici.put(4000,"Bosko");

nastavnici.put(4001,"Drazen");

nastavnici.put(4002,"Sanja");

for(Map.Entry m:nastavnici.entrySet()){

System.out.println(m.getKey()+" "+m.getValue());

}

}

}Entry подинтерфејс од Map. Користимо Map.Entry у петљи да дохватимо

елементе помоћу getKey() и getValue().

23

Recommended