45
Тема Тема 2 2 . . Колекции Колекции . .

Тема 2 . Колекции

Embed Size (px)

DESCRIPTION

Тема 2 . Колекции. Колекции. Темплейти ; Колекции, видове ; Изисквания към класовете, съхранявани в колекции ; Същност. Използване на темплейтни колекции и интерфейси ; Работа с темплейти и потребителско дефиниране на темплейтни класове. Колекции. Дефиниция: - PowerPoint PPT Presentation

Citation preview

Page 1: Тема  2 .  Колекции

Тема Тема 22. . КолекцииКолекции..

Page 2: Тема  2 .  Колекции

КолекцииКолекции

• ТемплейтиТемплейти;;• Колекции, видовеКолекции, видове;; • Изисквания към класовете, Изисквания към класовете,

съхранявани в колекциисъхранявани в колекции;;• Същност. Използване на Същност. Използване на

темплейтни колекции и темплейтни колекции и интерфейсиинтерфейси;;

• Работа с темплейти и Работа с темплейти и потребителско дефиниране на потребителско дефиниране на темплейтни класоветемплейтни класове..

Page 3: Тема  2 .  Колекции

КолекцииКолекцииДефиниция:Дефиниция:

Колекции (Контейнерни класове)Колекции (Контейнерни класове) са са класове, които съхраняват обекти от класове, които съхраняват обекти от произволен тип.произволен тип.

Особености:Особености: Не е от значение какъв е типът на обекта, Не е от значение какъв е типът на обекта,

който съхраняват-който съхраняват- полиморфизъм ; полиморфизъм ; Тип на данните в колекцията е Тип на данните в колекцията е

java.lang.Object;java.lang.Object; Съхраняването на прости типове е Съхраняването на прости типове е

проблем;проблем; Типово преобразуване към реалния тип, Типово преобразуване към реалния тип,

когато се използват.когато се използват.

Page 4: Тема  2 .  Колекции

КолекцииКолекции

Например:Например: List съхранява подредена List съхранява подредена

поредица от елементи от поредица от елементи от класа Object. класа Object.

Map съхранява асоциации от Map съхранява асоциации от двойка, съставена от ключ и двойка, съставена от ключ и стойност, които също са от стойност, които също са от общия базов тип (класа) общия базов тип (класа) Object. Object.

Page 5: Тема  2 .  Колекции

КолекцииКолекции

Пример:Пример:

Date date = new Date( ); Date date = new Date( ); List list = new ArrayList( ); List list = new ArrayList( ); list.add( date ); // допуска се list.add( date ); // допуска се

произволна // референция към произволна // референция към типтип

//... //... Date firstElement = (Date)list.get(0); Date firstElement = (Date)list.get(0);

Page 6: Тема  2 .  Колекции

КолекцииКолекции

Решение:Решение: Преписване на метода на колекцията:Преписване на метода на колекцията:

public void add( Object o ) { ... } public void add( Object o ) { ... }

public void add( Date d ) { ... } public void add( Date d ) { ... }

// припокриващ метод за дата // припокриващ метод за дата Написване на собствен DateList, в който Написване на собствен DateList, в който

да се делегират методите на класа, но да се делегират методите на класа, но да работи с дати. Недостатъци... да работи с дати. Недостатъци... Collections.sort( ) Collections.sort( )

Page 7: Тема  2 .  Колекции

Шаблонни колекцииШаблонни колекции

Темплейтизиране на колекциите от Темплейтизиране на колекциите от първата групапървата група

( след версия 5.0 ). Добавяне на ( след версия 5.0 ). Добавяне на шаблонна променлива E. шаблонна променлива E.

Примерна спецификация на колекцията Примерна спецификация на колекцията List в новата версия :List в новата версия :

public class List< E > { ... public class List< E > { ... public void add( E element ) { ... } public void add( E element ) { ... } public E get( int i ) { ... } public E get( int i ) { ... } } }

Page 8: Тема  2 .  Колекции

Шаблонни колекцииШаблонни колекции

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

При деклариране на променливи При деклариране на променливи на инстанциите на класа;на инстанциите на класа;

За аргументите на методите;За аргументите на методите; Връщаните типове от методите.Връщаните типове от методите.

Например: E е аргумент на метода Например: E е аргумент на метода add( ), връщан тип на метода get( ). add( ), връщан тип на метода get( ).

Page 9: Тема  2 .  Колекции

Шаблонни колекцииШаблонни колекции

Примери за използване:Примери за използване:List<String> listOfStrings; List<String> listOfStrings; List<Date> dates;List<Date> dates;List<java.math.BigDecimal> decimals;List<java.math.BigDecimal> decimals;List<Foo> foos; List<Foo> foos; Резултат:Резултат:public class List< String > { ... public class List< String > { ... public void add( String element ) { ... } public void add( String element ) { ... } public String get( int i ) { ... } public String get( int i ) { ... } } }

Page 10: Тема  2 .  Колекции

Шаблонни колекцииШаблонни колекции

List<String> listOfStrings = new List<String> listOfStrings = new ArrayList<String>( );ArrayList<String>( );

listOfStrings.add("eureka! "); listOfStrings.add("eureka! ");

String s = listOfStrings.get(0); // String s = listOfStrings.get(0); // "eureka! " "eureka! "

listOfStrings.add( new Date( ) ); listOfStrings.add( new Date( ) );

// грешка при компилация // грешка при компилация

Page 11: Тема  2 .  Колекции

Шаблонни колекцииШаблонни колекции

Асоциативни колекцииАсоциативни колекцииС два шаблонни аргумента - K, V . Типовете не С два шаблонни аргумента - K, V . Типовете не

могат да са еднакви.могат да са еднакви.

Примерна спецификация на колекцията Map в Примерна спецификация на колекцията Map в новата версия 5.0 : новата версия 5.0 :

public class Map< K, V > { ... public class Map< K, V > { ... public V put( K key, V value ) { ... } public V put( K key, V value ) { ... } // връща старата стойност по ключа // връща старата стойност по ключа public V get( K key ) { ... } public V get( K key ) { ... } } }

Page 12: Тема  2 .  Колекции

Йерархия на колекциитеЙерархия на колекциите

Page 13: Тема  2 .  Колекции

МасивиМасивиОсобености на масивите:Особености на масивите:

имат член променлива, само за четене имат член променлива, само за четене length length която връща големината на масива;която връща големината на масива;

По време на изпълнение се проверява и По време на изпълнение се проверява и генерира изключение при опит за достъп генерира изключение при опит за достъп извън границите на масива;извън границите на масива;

Всички масиви се създават в динамичната Всички масиви се създават в динамичната памет и могат да се присвояват един на друг памет и могат да се присвояват един на друг (копира се само референцията към паметта);(копира се само референцията към паметта);

При деклариране на масив в При деклариране на масив в JavaJava се декларира се декларира само референция към масива (може и нулева). само референция към масива (може и нулева). Реалната памет се създава с оператора Реалната памет се създава с оператора newnew ; ;

началната инициализация на новосъздадения началната инициализация на новосъздадения масивмасив с нулеви стойности в зависимост от с нулеви стойности в зависимост от типа;типа;

Page 14: Тема  2 .  Колекции

МасивиМасивиПримери:Примери:

int [] A; // A е указател (референция към масива)int [] A; // A е указател (референция към масива)A = new int [10]; // указателя A се инициализира с масив сA = new int [10]; // указателя A се инициализира с масив с//// големина 10 от типа (int) големина 10 от типа (int)A[0] = 5; // запис на данни в първия елемент на AA[0] = 5; // запис на данни в първия елемент на Aint [] A = new int[10];int [] A = new int[10]; ... A.length ... // стойност 10... A.length ... // стойност 10 A = new int[20];A = new int[20]; ... A.length ... // нова стойност 20... A.length ... // нова стойност 20

Двумерни масиви:Двумерни масиви: int [][] A = new int[4][3]; int [][] A = new int[4][3]; int [][] A = new int[4][]; int [][] A = new int[4][]; A[1] = new int[4];A[1] = new int[4];A[3] = new int[2]; A[3] = new int[2];

Page 15: Тема  2 .  Колекции

МасивиМасиви

Копиране на масиви в Java. Копиране на масиви в Java.

Използва се методът на java.lang.System arraycopy . Използва се методът на java.lang.System arraycopy . За изпълнението се използва синтаксис, подобен За изпълнението се използва синтаксис, подобен на println. Параметрите са: на println. Параметрите са:

src: масив source (масивът от който се копира) src: масив source (масивът от който се копира) srcPos: начален индекс на масива от който се srcPos: начален индекс на масива от който се

копиракопира dst: масив destination (масивът към който се dst: масив destination (масивът към който се

копира)копира) dstPos: начален индекс на масива към който се dstPos: начален индекс на масива към който се

копиракопира count: брой на стойностите за копиранеcount: брой на стойностите за копиране

Page 16: Тема  2 .  Колекции

МасивиМасиви

Пример за копиране на масиви:Пример за копиране на масиви:int [] A, B;int [] A, B;A = new int[10];A = new int[10];// зареждане на масива A// зареждане на масива AB = new int[5];B = new int[5];System.arraycopy(A, 0, B, 0, 5) System.arraycopy(A, 0, B, 0, 5) // копират се 5 стойности от A в B// копират се 5 стойности от A в BSystem.arraycopy(A, 9, B, 4, 1) System.arraycopy(A, 9, B, 4, 1) // копира се последната стойност на A// копира се последната стойност на A// в последната на B// в последната на B

Page 17: Тема  2 .  Колекции

Интерфейс CollectionИнтерфейс Collection

Същност: Родител на всяка колекция е Същност: Родител на всяка колекция е интерфейса интерфейса CollectionCollection . Интерфейса не . Интерфейса не определя вътрешната организация на определя вътрешната организация на елементите, негови членове, не указва елементите, негови членове, не указва има ли дублиране на елементи, има ли има ли дублиране на елементи, има ли подредба на елементите и др. Тези подредба на елементите и др. Тези детайли на имплементацията са детайли на имплементацията са оставени за наследниците. В него са оставени за наследниците. В него са дефинирани най-общите за всички дефинирани най-общите за всички методи:методи:

Page 18: Тема  2 .  Колекции

Интерфейс CollectionИнтерфейс CollectionОсновни методиОсновни методи Добавяне:Добавяне:

public boolean add( public boolean add( elementelement ); ); Премахване:Премахване:

public boolean remove( public boolean remove( elementelement ); ); Проверка:Проверка:

public boolean contains( public boolean contains( elementelement ); ); Брой елементи:Брой елементи:

public int size( );public int size( ); Има ли елементи:Има ли елементи:

public boolean isEmpty( );public boolean isEmpty( ); Връща обекта итератор, който позволява достъп до Връща обекта итератор, който позволява достъп до

елементите: елементите:

public Iterator iterator( );public Iterator iterator( ); Между колекции: addAll( ), removeAll( ), containsAll( )Между колекции: addAll( ), removeAll( ), containsAll( )

Page 19: Тема  2 .  Колекции

Темплейтен Интерфейс Темплейтен Интерфейс CollectionCollection

Същност: Същност: Позволява да се параметризира типа на Позволява да се параметризира типа на

интерфейса за темплейтната променлива от интерфейса за темплейтната променлива от определен тип (Date):определен тип (Date):

Collection<Date> dates = new ArrayList<Date>( );Collection<Date> dates = new ArrayList<Date>( );

dates.add( new Date( ) ); dates.add( new Date( ) );

dates.add( "foo" ); // грешка при компилация!! dates.add( "foo" ); // грешка при компилация!!

Компилаторът проверява за съответствие на типа и Компилаторът проверява за съответствие на типа и продуцира грешка. Например непроверено е добавянето:продуцира грешка. Например непроверено е добавянето:

Collection dates = new ArrayList( ); Collection dates = new ArrayList( );

dates.add( new Date( ) ); dates.add( new Date( ) );

Page 20: Тема  2 .  Колекции

Преобразуване на колекция Преобразуване на колекция към масив и обратнокъм масив и обратно

Същност:Същност:Преобразуване на колекция в масив е Преобразуване на колекция в масив е

специална конвенция на езика, която специална конвенция на езика, която позволява съдържанието на колекцията позволява съдържанието на колекцията да се копира в масив.да се копира в масив.

Шаблонен вариант:Шаблонен вариант:public Object[] toArray( );public Object[] toArray( );public <E> E[] toArray( E[] a );public <E> E[] toArray( E[] a ); Нешаблонен вариант:Нешаблонен вариант: public Object[] toArray( Object [] a );public Object[] toArray( Object [] a ); Обратно преобразуване. Използва се Обратно преобразуване. Използва се

статичния метод статичния метод asListasList на класа на класа java.util.Arraysjava.util.Arrays : :

String [] myStrings = myCollection( new String [] myStrings = myCollection( new String[0] ); String[0] );

List list = Arrays.asList( myStrings );List list = Arrays.asList( myStrings );

Page 21: Тема  2 .  Колекции

Итериране на колекцииИтериране на колекции

Става с обектаСтава с обекта iterator iterator предоставен предоставен от java.util.Iterator. Основни от java.util.Iterator. Основни методи:методи:

public Object next( ) - следващия елемент на public Object next( ) - следващия елемент на колекцията;колекцията;

public boolean hasNext( ) - връща true ако може public boolean hasNext( ) - връща true ако може да се да се

извика next( ), за да се получи следващия елемент.извика next( ), за да се получи следващия елемент. public void remove( ) - премахване на последнияpublic void remove( ) - премахване на последния

върнат от next( ) елемент на колекцията;върнат от next( ) елемент на колекцията;

Page 22: Тема  2 .  Колекции

Итериране на колекцииИтериране на колекцииПример:Пример: Вариант с whileВариант с while

public void printElements(Collection c, PrintStream out) public void printElements(Collection c, PrintStream out)

{ {

Iterator iterator = c.iterator( ); Iterator iterator = c.iterator( );

while ( iterator.hasNext( ) ) while ( iterator.hasNext( ) )

out.println( iterator.next( ) ); out.println( iterator.next( ) );

} } Вариант с Вариант с forfor

public static void public static void printElementsprintElements(Collection c) {(Collection c) {

for(Iterator x = c.iterator(); x.hasNext();)for(Iterator x = c.iterator(); x.hasNext();)

System.out.println(x.next().toString() + " ");System.out.println(x.next().toString() + " ");

}}

Page 23: Тема  2 .  Колекции

Итериране на колекцииИтериране на колекцииДопуска се и общия вариант на цикъл за Допуска се и общия вариант на цикъл за

достъп до цялата колекция. Например, достъп до цялата колекция. Например, може да се премине през цялата може да се премине през цялата колекция от елементи с операторния колекция от елементи с операторния вариант на for:вариант на for:

Collection<Date> collection = ... Collection<Date> collection = ... for( Date date : collection ) for( Date date : collection ) System.out.println( date );System.out.println( date ); Предоставя се само за типа Collection, не Предоставя се само за типа Collection, не

и за Map, защото в него се съхраняват и за Map, защото в него се съхраняват двойки и няма еднозначност на двойки и няма еднозначност на елемента, който се достъпва (ключа елемента, който се достъпва (ключа или стойността).или стойността).

Page 24: Тема  2 .  Колекции

Колекции (Колекции (Интерфейс изброимост Интерфейс изброимост ))

Интерфейс изброимост се предоставя Интерфейс изброимост се предоставя от от javajava..utilutil..EnumerationEnumeration

Enumeration е итераторен интерфейс, Enumeration е итераторен интерфейс, който има подобни имена на методи: който има подобни имена на методи: nextElement( ) и hasMoreElements( ) но nextElement( ) и hasMoreElements( ) но прави същото. По старите класове са прави същото. По старите класове са предоставяли този интерфейс в предоставяли този интерфейс в случаите, където в по-новите се случаите, където в по-новите се използва итератор. Има възможност за използва итератор. Има възможност за преобразуване на изброимия интерфейс преобразуване на изброимия интерфейс в списък със статични методи на класа в списък със статични методи на класа java.util.Collections:java.util.Collections:

List list = Collections.list( enumeration ); List list = Collections.list( enumeration );

Page 25: Тема  2 .  Колекции

Колекции-видовеКолекции-видове

Интерфейсът Collection има два Интерфейсът Collection има два основни интерфейса-основни интерфейса-наследници. наследници.

Set представя колекция, в която Set представя колекция, в която не се допуска дублиране на не се допуска дублиране на елементите; елементите;

List е колекция, чиито елементи List е колекция, чиито елементи са подредени последователно;са подредени последователно;

Page 26: Тема  2 .  Колекции

Колекция SetКолекция Set

Същност:Същност:SetSet (Интерфейс) имплементира (Интерфейс) имплементира

методите на Collection. Той методите на Collection. Той осигурява правило за недопускане осигурява правило за недопускане на дублиране. Ако се направи опит на дублиране. Ако се направи опит за извикване на метода add( ) при за извикване на метода add( ) при наличие на елемента в наличие на елемента в колекцията, резултатът е false. колекцията, резултатът е false.

Page 27: Тема  2 .  Колекции

Колекция Колекция SortedSetSortedSet

SortedSetSortedSet (Интерфейс)(Интерфейс) е модификация, е модификация, която добавя няколко метода към Set. която добавя няколко метода към Set.

Промени: При извикване на add() и Промени: При извикване на add() и remove() се поддържа реда на remove() се поддържа реда на елементите. елементите.

Добавени методи:Добавени методи: Създаване на подмножества subSet( );Създаване на подмножества subSet( ); Глава headSet( );Глава headSet( ); Опашка tailSet( );Опашка tailSet( ); Методите first( ), last( ) и comparator( ) Методите first( ), last( ) и comparator( )

връщат първи, последен и обектът, връщат първи, последен и обектът, използван за сравнение на елементите.използван за сравнение на елементите.

Page 28: Тема  2 .  Колекции

Колекция Колекция ListList

Същност :Същност :List е линейна колекцияList е линейна колекция

((Интерфейс Интерфейс )),, подобна на масив с подобна на масив с методи за промяна на позицията методи за промяна на позицията на елементитена елементите. .

Page 29: Тема  2 .  Колекции

Колекция Колекция ListListОсновни методи:Основни методи: public void add( E public void add( E elementelement ) добавя елемент в края ) добавя елемент в края

на списъка;на списъка; public void add( int public void add( int indexindex, E , E elementelement ) вмъква ) вмъква

елемент на позицията, която е параметър. Ако е елемент на позицията, която е параметър. Ако е по-малка от нула или по-голяма от дължината се по-малка от нула или по-голяма от дължината се предизвиква изключение предизвиква изключение IndexOutOfBoundsException. Следващите елементи IndexOutOfBoundsException. Следващите елементи се изместват с позиция след вмъкнатия на се изместват с позиция след вмъкнатия на индекса index.индекса index.

public void remove( int public void remove( int indexindex ) премахва елемента ) премахва елемента на указаната позиция; на указаната позиция;

public E get( int public E get( int indexindex ) връща елем ) връща елемeeнта на нта на указаната позиция;указаната позиция;

public Object set( int public Object set( int indexindex, E , E elementelement ) промяна на ) промяна на елемента на указаната позиция със елемента на указаната позиция със специфицирания като параметър. Трябва да специфицирания като параметър. Трябва да съществува такъв или се предизвиква съществува такъв или се предизвиква IndexOutOfBoundsException.IndexOutOfBoundsException.

Page 30: Тема  2 .  Колекции

КолекцияКолекция Map Map

Същност:Същност:

Интерфейс, включен в пакета java.util.Map. Интерфейс, включен в пакета java.util.Map.

ПредназначениеПредназначение::

ЗЗа съхраняване на колекции от двойки а съхраняване на колекции от двойки ключ/стойност. Това са изветните съхранители ключ/стойност. Това са изветните съхранители “речник” или “асоциативен масив”. Те “речник” или “асоциативен масив”. Те поддържат и достъпват елементите чрез поддържат и достъпват елементите чрез ключовата стойност. При запис на елемент в ключовата стойност. При запис на елемент в контейнера се асоциира записаната стойност контейнера се асоциира записаната стойност към ключа.към ключа. При темплейтезирания вариант Map При темплейтезирания вариант Map се създава с два параметризирани типа-за ключа се създава с два параметризирани типа-за ключа

и за стойносттаи за стойността..

Page 31: Тема  2 .  Колекции

КолекцияКолекция Map Map

Примери:Примери: Параметризиран (шаблонен):Параметризиран (шаблонен): Map<String, Date> dateMap =Map<String, Date> dateMap = new HashMap<String, Date>( ); new HashMap<String, Date>( );

dateMap.put( "today", new Date( ) ); dateMap.put( "today", new Date( ) ); Date today = dateMap.get( "today" );Date today = dateMap.get( "today" ); Непараметризиран вариант: Непараметризиран вариант: Map dateMap = new HashMap( ); Map dateMap = new HashMap( ); dateMap.put( "today", new Date( ) );dateMap.put( "today", new Date( ) ); Date today = Date today =

(Date)dateMap.get( "today" );(Date)dateMap.get( "today" );

Page 32: Тема  2 .  Колекции

КолекцияКолекция Map Map

Методи:Методи: public V put( K public V put( K keykey, V , V valuevalue) - добавяне на ) - добавяне на

двойка ключ/стойност;двойка ключ/стойност; public V get( K public V get( K keykey ) получаване на стойност, ) получаване на стойност,

съответстваща на ключа; съответстваща на ключа; public V remove( K public V remove( K keykey ) премахване на ) премахване на

стойност, съответстваща на ключа;стойност, съответстваща на ключа; public int size( ) – брой на двойките public int size( ) – брой на двойките

ключ/стойност;ключ/стойност; public Set keySet( ) – получаване в Set на public Set keySet( ) – получаване в Set на

всички ключове на обекта;всички ключове на обекта; public Collection values( ) – получаване в public Collection values( ) – получаване в

Collection от всички стойности на обекта Collection от всички стойности на обекта (може да има дублирани елементи);(може да има дублирани елементи);

Page 33: Тема  2 .  Колекции

КолекцияКолекция SortedMap SortedMap

Map има един наследен интерфейс - SortedMap. Map има един наследен интерфейс - SortedMap. Той се различава по това, че поддържа Той се различава по това, че поддържа елементите си сортирани по реда на ключовата елементите си сортирани по реда на ключовата стойност. Предоставя методите subMap( ), стойност. Предоставя методите subMap( ), headMap( ) и tailMap( ) за получаване на headMap( ) и tailMap( ) за получаване на подмножества от сортирания map. Предоставя подмножества от сортирания map. Предоставя също метод comparator( ) който връща също метод comparator( ) който връща сравнителя за сортиране. сравнителя за сортиране.

ТъТъйй като поддържа две стойности, има два като поддържа две стойности, има два отделни вида итератора – за ключа и за отделни вида итератора – за ключа и за

стойността.стойността.

Page 34: Тема  2 .  Колекции

Колекции - обобщениеКолекции - обобщение

Използването на контейнерите на езика Използването на контейнерите на езика за съхраняване на обекти от за съхраняване на обекти от произволен клас се основава на произволен клас се основава на класовата йерархия с базов клас Object. класовата йерархия с базов клас Object.

За да се осигури организация на За да се осигури организация на обектите в колекциите се използват обектите в колекциите се използват методите на базовия клас Object. методите на базовия клас Object.

Те се предефинират в класовете за Те се предефинират в класовете за съхраняване в колекции и съхраняване в колекции и осигуряват съответните методи за осигуряват съответните методи за достъп на колекцията.достъп на колекцията.

Page 35: Тема  2 .  Колекции

Колекции - обобщениеКолекции - обобщение

Общи изисквания и използване на Общи изисквания и използване на интерфейсите:интерфейсите:

Множество Множество SetSet:: Set Set - Всеки елемент да е уникален, в противен - Всеки елемент да е уникален, в противен

случай не се добавя ;случай не се добавя ; Обектите, които се добавят към Обектите, които се добавят към SetSet трябва да трябва да

предефинират метода на предефинират метода на Object equalsObject equals( ), за да ( ), за да се осигури уникалността;се осигури уникалността;

SetSet има еквивалентен интерфейс като има еквивалентен интерфейс като CollectionCollection;; При При SetSet не се гарантира подредба на не се гарантира подредба на

елементите.елементите.

Page 36: Тема  2 .  Колекции

Колекции - обобщениеКолекции - обобщение

Хеширано множество HashSet:Хеширано множество HashSet: HashSet HashSet се използва за представяне на се използва за представяне на

множества с изключение на много малки;множества с изключение на много малки; Обектите трябва да осигуряват метода Обектите трябва да осигуряват метода

hashCodehashCode( );( );Множество като масив ArraySet:Множество като масив ArraySet: ArraySetArraySet е множество, което може да се е множество, което може да се

използва като масив;използва като масив; Проектирано е за много малки множества, Проектирано е за много малки множества,

особено за често създавани и унищожаваниособено за често създавани и унищожавани За малки множества, създаването и За малки множества, създаването и

итерирането е по-бързо от това за итерирането е по-бързо от това за HashSetHashSet; ; Ефективността се намалява при големи Ефективността се намалява при големи

множества спрямо множества спрямо SetSet Не се изисква HashCode( ).Не се изисква HashCode( ).

Page 37: Тема  2 .  Колекции

Колекции - обобщениеКолекции - обобщение

Множество като дърво TreeSet:Множество като дърво TreeSet: TreeSet подредена версия на Set като двоично

дърво; Изисква имплементация на метода

Comparable.compareTo(...) на Object

Page 38: Тема  2 .  Колекции

Имплементиране на сравнение Имплементиране на сравнение равенстворавенство

Същност:Същност: Базовият клас на всички класове в езика Базовият клас на всички класове в езика Java-kJava-kласът ласът ObjectObject предоставя интерфейсен метод за определяне на предоставя интерфейсен метод за определяне на операцията равенство при сравнение за равенство на два операцията равенство при сравнение за равенство на два обекта от потребителския клас. Методът е предикатен-обекта от потребителския клас. Методът е предикатен-връща логическа стойност от изпълнението си. връща логическа стойност от изпълнението си.

Предназначение:Предназначение: За сравняване на обекти. За сравняване на обекти.Формат: Формат: booleanboolean equals(Object toCompare)equals(Object toCompare)

Методът сеМетодът се предефинира в потребителския клас с цел да се предефинира в потребителския клас с цел да се използва операцията при съхраняването използва операцията при съхраняването на обектите от на обектите от класакласа в контейнерите и търсене на обекти. в контейнерите и търсене на обекти.

Допуска се като параметър да се използва обект от класа, а не Допуска се като параметър да се използва обект от класа, а не базовия клас. базовия клас.

Може да се предефинира конкретно за класа по следния Може да се предефинира конкретно за класа по следния начин:начин:

public boolean equals(CStudent toCompare)public boolean equals(CStudent toCompare)

Page 39: Тема  2 .  Колекции

Имплементиране на сравнение Имплементиране на сравнение равенстворавенство

Изисквания към функцията, реализираща метода:Изисквания към функцията, реализираща метода: рефлексивна - за всяка референция x x.equals(x) рефлексивна - за всяка референция x x.equals(x) да да е винаги е винаги

истинаистина::if (this == obj)if (this == obj) return true;return true; симетрична- за всяка референция x и y, x.equals(y) е true симетрична- за всяка референция x и y, x.equals(y) е true

тогава и само тогава, когато y.equals(x) е true;тогава и само тогава, когато y.equals(x) е true; транзитивана - за всяка референция x, y и z, ако x.equals(y) е транзитивана - за всяка референция x, y и z, ако x.equals(y) е

true и y.equals(z) е true, тогава x.equals(z) е true.true и y.equals(z) е true, тогава x.equals(z) е true. консистентна – една функция е консистентна, ако за всяка консистентна – една функция е консистентна, ако за всяка

референция на обектите-x и y многократните извиквания на референция на обектите-x и y многократните извиквания на x.equals(y) винаги връща един и същ резултат от сравнениетоx.equals(y) винаги връща един и същ резултат от сравнението (не предизвиква вътрешни състояния)(не предизвиква вътрешни състояния);;

Различни класове са несравними:Различни класове са несравними:if (getClass() != obj.getClass()) return false;if (getClass() != obj.getClass()) return false; Ако базовите им класове са различни, са различни:Ако базовите им класове са различни, са различни:if(!super.equals(obj)) return false;if(!super.equals(obj)) return false; сравнение с нулева референция. За всяка референция към сравнение с нулева референция. За всяка референция към

обект obj, която е ненулева obj.equals(null) е винаги falseобект obj, която е ненулева obj.equals(null) е винаги false::if (obj == null) return false;if (obj == null) return false;

Page 40: Тема  2 .  Колекции

Имплементиране на сравнение Имплементиране на сравнение равенстворавенство

Пример-Пример-Предефиниране на сравнение за равенство между Предефиниране на сравнение за равенство между обектите от класа студент, която имплементира равенството обектите от класа студент, която имплементира равенството на студентите по факултетен номер:на студентите по факултетен номер:

public boolean equals(Object obj) {public boolean equals(Object obj) {if (this == obj)if (this == obj)

return true;return true;if (obj == null)if (obj == null)

return false;return false;if (getClass() != obj.getClass())if (getClass() != obj.getClass())

return false;return false;if(!super.equals(obj))if(!super.equals(obj))

return false;return false;final Student other = (Student) obj;final Student other = (Student) obj;if (strFacNumer == null) {if (strFacNumer == null) {

if (other.strFacNumer != null)if (other.strFacNumer != null)return false;return false;

} else if (!strFacNumer.equals(other.strFacNumer))} else if (!strFacNumer.equals(other.strFacNumer))return false;return false;

return true;return true;}}

Page 41: Тема  2 .  Колекции

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

Същност:Същност: В дефиницията на класа, който ще се В дефиницията на класа, който ще се съхранява в сортирана колекция трябва да се съхранява в сортирана колекция трябва да се обяви интерфейса, с който да се сравняват обяви интерфейса, с който да се сравняват обектите при подредбата им в контейнера. обектите при подредбата им в контейнера. Това става с обявяването като наследник на Това става с обявяването като наследник на класа-интерфейса Comparable:класа-интерфейса Comparable:

public class Student extends Person public class Student extends Person implements implements ComparableComparable {…}{…}

Имплементиране:Имплементиране:Функцията от този интерфейс, която трябва да се Функцията от този интерфейс, която трябва да се

предефинира е предефинира е compareTocompareTo: : compareTocompareTo е с резултат е с резултат intint и има смисъла на сравнител, връщащ 1 (по- и има смисъла на сравнител, връщащ 1 (по-малко), -1 (по-голямо) и 0 (равно). малко), -1 (по-голямо) и 0 (равно).

Page 42: Тема  2 .  Колекции

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

Пример за предефиниране за сравняване на студенти по Пример за предефиниране за сравняване на студенти по факултетен номер в нарастващ и намаляващ ред. факултетен номер в нарастващ и намаляващ ред. Използва се сравнението на тип String, което е Използва се сравнението на тип String, което е организирано на същия принцип. Добавят се методи за организирано на същия принцип. Добавят се методи за сравнението:сравнението:

Примери:Примери:

public int compareTo(Object o) {public int compareTo(Object o) { return (strFacNumer.compareTo(((Student)o).strFacNumer));return (strFacNumer.compareTo(((Student)o).strFacNumer));}}

За подредба в нарастващ ред може да се използва За подредба в нарастващ ред може да се използва обратното сравнение:обратното сравнение:

public int compareTo(Object o) {public int compareTo(Object o) { return (((Student)o).strFacNumer.compareTo(strFacNumer));return (((Student)o).strFacNumer.compareTo(strFacNumer));}}

Page 43: Тема  2 .  Колекции

Създаване на класове, Създаване на класове, съхраняващи колекциисъхраняващи колекции

Пример (TreeSet):Пример (TreeSet):publicpublic classclass CollectionSamples { CollectionSamples {publicpublic Set oColl = Set oColl = newnew TreeSet(); //Създаване на множество TreeSet(); //Създаване на множество public CollectionSamples(String fileName ) { // Конструктор от файлpublic CollectionSamples(String fileName ) { // Конструктор от файл try {try { RandomAccessFile myFile = new RandomAccessFile(fileName,"r");RandomAccessFile myFile = new RandomAccessFile(fileName,"r"); String[] res = new String[4]; //формат: Ivanov m mr. 056001String[] res = new String[4]; //формат: Ivanov m mr. 056001 String strLine;String strLine; while((strLine = myFile.readLine()) != null ) { while((strLine = myFile.readLine()) != null ) { res = strLine.split(" ");res = strLine.split(" "); Object oPersonExpl = new Student(res[0],res[1],res[2],res[3]);Object oPersonExpl = new Student(res[0],res[1],res[2],res[3]); oColl.add(oPersonExpl);oColl.add(oPersonExpl); }} myFile.close();myFile.close(); }} catch (FileNotFoundException e) {/* да се обработи File Not Found */ }catch (FileNotFoundException e) {/* да се обработи File Not Found */ } catch(EOFException e) {/* да се обработи End of file */ }catch(EOFException e) {/* да се обработи End of file */ } catch (IOException e){/* да се обработи Input/Output Error */ }catch (IOException e){/* да се обработи Input/Output Error */ }}}

Page 44: Тема  2 .  Колекции

Създаване на класове, Създаване на класове, съхраняващи колекциисъхраняващи колекции

/* Метод за итериране на колекцията и обработка на /* Метод за итериране на колекцията и обработка на информацията-извеждане на системния изход. информацията-извеждане на системния изход.

*/*/

public void printColl(Collection c) {public void printColl(Collection c) { for(Iterator It = c.iterator(); It.hasNext();)for(Iterator It = c.iterator(); It.hasNext();) System.out.println(It.next().toString());System.out.println(It.next().toString()); }} public static void main(String[] args) {public static void main(String[] args) { CollectionSamples obj = new CollectionSamples("Input.txt");CollectionSamples obj = new CollectionSamples("Input.txt"); obj.printColl(obj.oColl);obj.printColl(obj.oColl); }}} // public class CollectionSamples} // public class CollectionSamples

Page 45: Тема  2 .  Колекции

Създаване на класове, Създаване на класове, съхраняващи колекциисъхраняващи колекции

Използването на общия интерфейс като формален параметър Използването на общия интерфейс като формален параметър позволява да се промени типа на колекцията с промяна на полето, позволява да се промени типа на колекцията с промяна на полето, например, може да се промени:например, може да се промени:

publicpublic Set oColl = Set oColl = newnew TreeSet(); TreeSet();със следните дефиниции:със следните дефиниции:

public Collection oColl = new ArrayList(); // За създаване на колекция от ArrayListpublic Collection oColl = new ArrayList(); // За създаване на колекция от ArrayList

public Collection oColl = new Vector(); // За създаване на колекция от класа Vectorpublic Collection oColl = new Vector(); // За създаване на колекция от класа Vector

public Collection oColl = new Stack(); //За създаване на колекция от класа Stackpublic Collection oColl = new Stack(); //За създаване на колекция от класа Stack

public Collection oColl = new LinkedList(); //За създаване на колекция от класа LinkedListpublic Collection oColl = new LinkedList(); //За създаване на колекция от класа LinkedList

public List oColl = new ArrayList();// За създаване на списък от класа ArrayListpublic List oColl = new ArrayList();// За създаване на списък от класа ArrayList

public List oColl = new Vector();// За създаване на списък от класа Vectorpublic List oColl = new Vector();// За създаване на списък от класа Vector

public List oColl = new Stack();// За създаване на списък от класа Stackpublic List oColl = new Stack();// За създаване на списък от класа Stack

public List oColl = new LinkedList();// За създаване на списък от класа LinkedListpublic List oColl = new LinkedList();// За създаване на списък от класа LinkedList

public Set oColl = new HashSet();//За създаване на множество от класа HashSetpublic Set oColl = new HashSet();//За създаване на множество от класа HashSet