МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
ЗВІТ
До виконання лабораторної роботи №8
На тему: “ Використання колекцій в Java”
З курсу “ Об’єктно-орієнтоване програмування”
Львів – 2009
МЕТА РОБОТИ
Метою роботи є придбання навиків використання колекцій в програмах на мові Java.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
3.1. Компоненти колекцій
Колекція, іноді звана контейнером, - це об'єкт, який об'єднує декілька елементів в один об'єкт. Колекції використовуються для зберігання даних, доступу і маніпуляцій з даними, а також для передачі даних від одного методу до іншого. Колекція звичайно представляє дані, які представляють природну групу, наприклад телефонний довідник (колекція відповідностей між ім'ям і телефонним номером). Масив також можна розглядати як колекцію, об'єднуючу дані одного типа, елементи якої розташовані послідовно, у порядку зростання індексу.
Всі інтерфейси і класи, що відносяться до колекцій, знаходяться в пакеті java.util.
Схема колекцій (collections framework) - це уніфікована архітектура для уявлення і маніпулювання колекціями. Всі схеми колекцій містять наступні три компоненти:
Інтерфейси - абстрактні типи даних, що представляють колекції. Інтерфейси дозволяють маніпулювати колекціями незалежно від деталей їх уявлення. У Java, як і в інших об'єктно-орієнтованих мовах, ці інтерфейси звичайно утворюють ієрархію.
· Реалізації - конкретні реалізації інтерфейсів колекції. За своєю суттю вони є повторно використовуваними структурами даних.
· Алгоритми - методи, що виконують деякі корисні дії, наприклад, пошук або сортування, над об'єктами, що реалізовують інтерфейси колекцій. Ці методи називають поліморфними, оскільки один і той же метод може використовуватися в багатьох різних реалізаціях відповідного інтерфейсу колекцій. По суті алгоритми забезпечують повторно використовувану функціональність.
3.2. Інтерфейси колекцій
Ключові інтерфейси колекцій введені, починаючи з JDK 1.2, і використовуються для маніпулювання колекціями, а також для передачі їх від одного методу до іншого. Головною метою цих інтерфейсів є можливість маніпулювання колекціями незалежно від деталей їх реалізації.
· Інтерфейси утворюють дві ієрархії.
· Інтерфейс Collection є коренем першої ієрархії. Цей інтерфейс представляє групу об'єктів, відомих як його елементи. Деякі реалізації колекцій вирішують дублювання елементів, інші - ні. Пакет SDK не забезпечує прямої реалізації цього інтерфейсу і він використовується для передачі колекцій і маніпулювання ними, коли потрібне максимальне узагальнення.
· Інтерфейс Collection оголошує методи, що виконують наступні операції:
визначення кількості елементів в колекції (методи int size() і);
· перевірка, чи містить колекція елементи (метод boolean isEmpty());
· перевірка, чи знаходиться даний елемент в колекції (метод boolean contains(Object element));
· порівняння заданого об'єкту з даною колекцією на рівність (метод public boolean equals(Object про));
· додавання елементу в колекцію (метод boolean add(Object element)) і видалення елементу з колекції (метод boolean remove(Object element)), а також очищення колекції (метод public void clear());
· забезпечення ітераційних операцій над колекцією (метод Iterator iterator());
· забезпечення моста між колекціями і старими інтерфейсами прикладних програм, які припускали передачу їм параметрів об'єкту у вигляді масиву (методи Object[] toArray() і Object[] toArray(Object a[])).
Окрім цього, для колекцій визначені наступні групові операції
· boolean containsAll(Collection з)
· boolean addAll(Collection з)
· boolean removeAll(Collection з)
· boolean retainAll(Collection з)
які дозволяють перевірити, чи містяться всі елементи колекції з в даній колекції; додати всі елементи колекції до даної колекції; видалити з даної колекції всі елементи, що містяться в колекції з або залишити в даній колекції тільки ті елементи, які містяться в колекції з.
Метод iterator повертає об'єкт інтерфейсу Iterator. Інтерфейс Iterator оголошує наступні методи для колекцій:
· boolean hasNext(),
перевіряючий, чи є наступний елемент
Object next(),
що повертає наступний елемент і
void remove(),
що видаляє даний елемент.
Нижче наводиться приклад, як об'єкт Iterator використовується для фільтрації колекції, тобто видалення з колекції елементів, що відповідають певним умовам:
static void filter(Collection з)
·
for (Iterator i = з.iterator(); i.hasNext(); )
if (!cond(i.next()))
· i.remove();
}
Даний код є поліморфним, тобто працюватиме для будь-якої колекції, що підтримує видалення елементів, незалежно від реалізації.
· Інтерфейс Set є колекцією, яка не повинна містити елементів, що повторюються. Інтерфейс розширює інтерфейс Collection і містить ті ж методи, що і батьківський інтерфейс. Проте методи в цьому інтерфейсі мають конкретніший математичний сенс. Так, наприклад:
вираз s1.containsAll(s2) повертає true, якщо s2 є підмножиною s1;
· вираз s1.addAll(s2) перетворить s1 у об'єднання s1 і s2;
· вираз s1.retainAll(s2) перетворить s1 у перетин s1 і s2 (перетин двох множин містить елементи, загальні для обох множин);
· вираз s1.removeAll(s2) видаляє з s1 всі елементи, що містяться в s2.
· Інтерфейс List є впорядкованою колекцією (іноді званою послідовністю). Колекція List може містити впорядковані елементи. На додаток до операцій, успадкованих від колекції, інтерфейс оголошує наступні операції:
отримання значення елементу із заданим індексом (метод public Object get(int index)) і установка значення елементу із заданим індексом (метод public Object set(int index, Object element));
· пошук елементу в списку і повернення значення його індексу (методи public int indexOf(Object про) і public int lastIndexOf(Object про));
· додавання (метод public void add(int index, Object element)) або видалення (метод public Object remove(int index)) елементу по заданому індексу, а також очищення списку (метод public void clear());
· операції над частиною списку (метод public List subList(int fromIndex, int toIndex));
· ітераційні операції в списку (метод public ListIterator listIterator() і public ListIterator listIterator(int index)).
Інтерфейс ListIterator розширює інтерфейс Iterator і містить наступні методи проглядання списку:
Object next() - повертає наступний елемент (якщо наступного елементу немає, то викидається виключення типу NoSuchElementException);
· Object previous() - повертає попередній елемент (якщо попереднього елементу немає, то викидається виключення типу NoSuchElementException);
· boolean hasNext()- повертає true, якщо існує наступний елемент, інакше повертає false;
· boolean hasPrevious()- повертає true, якщо існує попередній елемент, інакше повертає false;
· int nextIndex()- повертає індекс наступного елементу (якщо наступного елементу немає, повертає розмір списку);
· int previousIndex()- повертає індекс попереднього елементу (якщо попереднього елементу немає, повертає -1);
· void add(Object obj) - вставляє obj в список перед елементом, який буде повернений наступним викликом next();
· void remove()- видаляє поточний елемент із списку (викидається виключення типу IllegalStateException, якщо метод remove() викликається, перш ніж викликаний метод next() або previous());
· void set(Object obj) - призначає obj на поточний елемент (це останній елемент, повернений викликом методу next() або previous()).
Об'єкти в програмах Java сортуються за допомогою методу
· public int compareTo(Object obj)
оголошеного в інтерфейсі Comparable (це єдиний метод даного інтерфейсу). Метод повинен повертати значення 0, якщо порівнювані об'єкти рівні один одному; значення, менше нуля, якщо що приймає об'єкт менше за obj; значення, більше нуля, якщо що приймає об'єкт більше за obj. Конкретні реалізації цього методу в об'єктних розширеннях числових класів (наприклад, Integer або Float) дозволяють порівнювати числа по значенню, для рядків - порівнювати рядки в лексикографічному порядку, для дат - в хронологічному порядку. Сортування, засноване на такому порівнянні, називається природним порядком порівняння.
Але часто необхідно відсортувати елементи колекції в порядку, відмінному від природного або відсортувати елементи без реалізації інтерфейсу Comparable. В цьому випадку необхідно реалізувати інтерфейс Comparator і забезпечити конкретну реалізацію його методів
· public int compare(Object o1, Object o2).
і
· public boolean equals(Object obj).
Перший метод повертає негативне значення, якщо об'єкт o1 менше об'єкту o2, значення 0 у разі рівності об'єктів і позитивне значення, якщо об'єкт o1 більше об'єкту o2. Другий метод перевизначає відповідний метод класу Object і перевіряє рівність даного об'єкту інтерфейсу Comparator з об'єктом obj.
·
· Інтерфейс SortedSet є розширенням інтерфейсу Set, елементи якого відсортовані в природному порядку або згідно порядку, що задається методом інтерфейсу Comparator.
· Інтерфейс реалізує наступні операції (додатково до операцій інтерфейсу Set):
операції над частиною набору (метод public SortedSet subSet(Object fromElement, Object toElement)), головною частиною набору (метод public SortedSet headSet(Object toElement)) і хвостовою частиною набору (метод public SortedSet tailSet(Object fromElement));
· повернення першого (метод public Object first()) і останнього (метод public Object last()) елементу відсортованого набору;
· доступ до інтерфейсу Comparator (метод public Comparator comparator()).
· Інтерфейс Map є об'єктом, який ставить у відповідність ключам значення. Ключі повинні бути унікальними і їм повинне відповідати єдине значення. Таку колекцію називають відображенням (map), словником (dictionary) або асоціативним масивом (associative array).
· У інтерфейсі Map визначені наступні основні операції:
отримання розміру відображення (метод public int size());
· перевірка відображення на наявність елементів (метод public boolean isEmpty());
· приміщення елементу у відображення (метод public Object put(Object key, Object value)) і отримання значення елементу із заданим ключем (метод public Object get(Object key));
· порівняння відображення із заданим об'єктом на рівність (метод public boolean equals(Object про));
· представлення ключів колекції у вигляді множини (метод public Set keySet());
· видалення елементу із заданим ключем (метод public Object remove(Object key)) і очищення відображення (метод public void clear());
· перевірка наявності елементу із заданим ключем (метод public boolean containsKey(Object key)) або значенням (метод public boolean containsValue(Object value));
· додавання до даного відображення всіх пар із заданого відображення (метод public void putAll(Map t));
· представлення всіх значень даного відображення у вигляді колекції (метод public Collection values());
· представлення колекції у вигляді множини, кожен елемент якого - пара з даного відображення, з якою можна працювати методами вкладеного інтерфейсу Map.Entry (метод public Set entrySet()).
Інтерфейс Map.Entry описує методи роботи з парами Ѐключ-значенняЀ, одержаними методом entrySet():
отримання ключа (метод public Object getKey()) і значення (метод public Object getValue());
· зміна значення (метод public Object setValue(Object value));
· порівняння заданого об'єкту з даною парою Ѐключ-значенняЀ на рівність (метод public boolean equals(Object про)).
Можливо також використання об'єктів Map, в яких ключам відповідає декілька значень. Це досягає звичайно, якщо як значення задати об'єкти List.
· Інтерфейс SortedMap є розширенням Map. Елементи для цього інтерфейсу відсортовані в природному порядку або згідно порядку, що задається методами інтерфейсу Comparator.
· Інтерфейс реалізує наступні операції (додатково до операцій інтерфейсу Map):
виділення частини відображення (метод public SortedMap subMap(Object fromKey, Object toKey)), головної частини відображення (метод public SortedMap subMap(Object fromKey, Object toKey)) або хвостової частини відображення (метод public SortedMap tailMap(Object fromKey));
· отримання першого (метод public Object firstKey()) і останнього (метод public Object lastKey()) елементу відображення;
· доступ до інтерфейсу Comparator (метод public Comparator comparator()).
В цілому, інтерфейс SortedMap є аналогом інтерфейсу SortedSet.
3.2. Реалізації колекцій і алгоритми
Реалізації є дійсними об'єктами даних, які утілюють в життя ключові інтерфейси колекцій, описані в попередньому розділі.
· Існують три типу реалізацій:
спільноцільові реалізації;
· пакувальники;
· альтернативні (convenience) реалізації.
Спільноцільові реалізації і їх зв'язок з інтерфейсами і структурами даних представлені в таблиці:
Інтерфейс
Реализації
Хеш-таблиця
Змінний масив
Збалансоване дерево
Зв'язаний список
Set
HashSet
TreeSet
LinkedHashSet
List
ArrayList
LinkedList
Map
HashMap
WeekHashMap
TreeMap
LinkedHashMap
· Всі реалізації мають не тільки схожі імена, але і схожу поведінку. Всі вони реалізують кожну з операцій, визначених в своєму інтерфейсі. Всі дозволяють використовувати елементи, ключі і значення з константою null.
· Основним при реалізації структур даних є вибір інтерфейсу. В більшості випадків вибір реалізації впливає тільки на продуктивність програми. Тому переважним стилем програмування є: спочатку створення колекції, потім вибір реалізації і привласнення нової колекції змінної відповідного інтерфейсного типа (або передача колекції методу, чекаючому аргумент інтерфейсного типа). Таким чином, програма стає незалежною від будь-яких нових методів, що додаються, в даній реалізації, залишаючи за програмістом право зміни реалізації, якщо це необхідно для ефективності програми.
·
3.2.1. Класи AbstractSet, AbstractList, AbstractSequentialList і AbstractMap
Клас AbstractSet є суперкласом для класів HashSet і TreeSet і містить реалізації методів equals() і removeAll() інтерфейсу Set.
· Клас AbstractList є суперкласом для класів AbstractSequentialList, ArrayList, Vector і містить реалізації двох методів add(), методів addAll(), clear(), equals(), get(), indexOf(), iterator(), lastIndexOf(), listIterator(), remove(), set(), sublist() інтерфейсу List.
· Клас AbstractList містить також метод
· protected void removeRange(int fromIndex, int toIndex)
який дозволяє видалити елементи списку в заданому діапазоні.
Клас AbstractSequentialList є суперкласом для класу LinkedList і містить реалізації методів add(), addAll(), get(), iterator(), listIterator(), remove()и set() інтерфейсу List.
· Клас AbstractMap є суперкласом для класів HashMap, TreeMap і WeakHashMap і містить реалізації методів clear(), containsKey(), containsValue(), entrySet(), equals(), get(), isEmpty(), keySet(), put(), putAll(), remove(), size() і values()интерфейса Map. Крім того, клас AbstractMap містить метод
· protected Object clone()
що дозволяє одержати порожню копію відображення (ключі і значення не копіюються), а також метод
public String toString()
що дозволяє перетворити відображення в рядкове уявлення.
3.2.2. Клас HashSet
Для інтерфейсу Set двома спільноцільовими реалізаціями є HashSet і TreeSet.
· Клас HashSet реалізує інтерфейс Set з підтримкою хеш-таблиці (реалізацією HashMap, що звичайно є) і має наступні конструктори:
HashSet() - створює новий, порожній набір з місткістю за умовчанням і чинником завантаження, рівним 0.75;
· HashSet(Collection з) - створює новий набір, що містить елементи заданої колекції;
· HashSet(int initialCapacity) - створює новий порожній набір із заданою місткістю і чинником завантаження, рівним 0.75;
· HashSet(int initialCapacity, float loadFactor) - створює новий порожній набір із заданою місткістю за умовчанням і заданим чинником завантаження.
У класі HashSet реалізовані наступні методи інтерфейсу Set: add(), clear(), contains(), isEmpty(), iterator(), remove() і size(). Метод
· public Object clone()
дозволяє одержати порожню копію об'єкту HashSet (без елементів).
3.2.3. Клас ArrayList
Клас ArrayList забезпечує реалізацію інтерфейсу Set для масивів із змінними розмірами. Так само, як об'єкти класу StringBuffer, об'єкти ArrayList мають дві характеристики - місткість і розмір масиву. Якщо розмір списку перевищить місткість, місткість автоматично збільшується на деяку кількість елементів.
· Клас ArrayList має наступні конструктори:
ArrayList() - створює порожній список;
· ArrayList(Collection з) - створює список із заданої колекції в порядку, заданому ітератором даної колекції;
· ArrayList(int initialCapacity) - створює порожній список із заданою місткістю.
Клас ArrayList реалізує наступні методи інтерфейсу List: два методи add(), два методи addAll(), методи clear(), contains(), get(), indexOf(), isEmpty(), lastIndexOf(), remove(), set(), size() і два методи toArray().
· Крім того, клас містить наступні власні методи:
public Object clone()- отримання порожньої копії об'єкту ArrayList (без елементів);
· public void ensureCapacity(int minCapacity) - збільшує місткість екземпляра ArrayList, якщо це необхідно, для того, щоб він міг містити число елементів, задане в minCapacity;
· protected void removeRange(int fromIndex, int toIndex) - видаляє з елементи в заданому діапазоні індексів;
· public void trimToSize() - зменшує місткість об'єкту ArrayList до його попереднього значення.
3.2.4. Клас LinkedList
Клас LinkedList, на додаток до реалізації методів інтерфейсу List забезпечує методи для отримання, видалення і вставки елементів в список, що дозволяє використовувати зв'язані списки як стеки, черги або черги з двома кінцями.
· Клас LinkedList має два конструктори:
LinkedList() - створює порожній зв'язаний список;
· LinkedList(Collection з) - створює зв'язаний список із заданої колекції в порядку, заданому ітератором даної колекції;
На додаток до двох методу add(), двом методам addAll(), методам clear(), contains(), get(), indexOf(), isEmpty(), lastIndexOf(), listIterator(), двом методам remove(), методам set(), size() і двом методам toArray() інтерфейсу List, клас LinkedList забезпечує наступні методи:
public void addFirst(Object про) і public void addLast(Object про) - додавання елементу в початок або кінець зв'язаного списку;
· public Object getFirst() і public Object getLast() - отримання першого або останнього елементу зв'язаного списку;
· public Object removeFirst() і public Object removeLast() - видалення першого або останнього елементу зв'язаного списку;
· public Object clone()- отримання порожньої копії об'єкту LinkedList (без елементів).
Клас ArrayList є переважним перед LinkedList у випадку, якщо необхідна висока продуктивність. Проте, якщо часто доводиться додавати елементи в початок списку або видаляти елементи з його середини, переважнішим є клас LinkedList. Цей клас повністю реалізує всі можливості класу Stack.
3.2.5. Клас HashMap
Клас HashMap є реалізацією інтерфейсу Map з використанням хеш-таблиць і по своїх можливостях відповідає класу HashTable.
· Клас HashMap має наступні конструктори:
HashMap() - створює нове, порожнє відображення з місткістю за умовчанням 16 і чинником завантаження, рівним 0.75;
· HashMap (Map m) - створює нове відображення, що містить елементи заданого відображення;
· HashMap (int initialCapacity) - створює нове, порожнє відображення із заданою місткістю і чинником завантаження, рівним 0.75;
· HashMap (int initialCapacity, float loadFactor) - створює нове, порожнє відображення із заданою місткістю і заданим чинником завантаження.
Клас HashMap реалізує наступні методи інтерфейсу Map: clear(), containsKey(), containsValue(), entrySet(), get(), isEmpty(), keySet(), put(), putAll(), remove(), size() і values() .
3.2.6. Клас Collections
Реалізації-оболонки делегують всю свою роботу колекціям, але додають в колекції деяку функціональність. Ці реалізації є анонімними, тобто вони не забезпечують загальнодоступний клас, а реалізуються за допомогою статичних методів в класі Collections.
· Клас Collections оперує з колекціями або повертає колекції. Клас не містить конструктора, а тільки наступні поля з модифікаторами public static final:
· List EMPTY_LIST для порожніх списків;
· Map EMPTY_MAP для порожніх відображень
· Set EMPTY_SET для порожніх множин, а також наступні public static методи, що в основному реалізовують поліморфні алгоритми:
int binarySearch(List list, Object key) - двійковий пошук в заданому списку заданого об'єкту;
· int binarySearch(List list, Object key, Comparator з) - двійковий пошук в заданому списку заданого об'єкту з використанням компаратора;
· void сміттю(List dest, List src) - копіювання списку-джерела в список призначення;
· void fill(List dest, Object про) - заповнення списку заданим об'єктом;
· Object max(Collection з) і Object min(Collection з) - повернення максимального або мінімального елементу колекції відповідно до природного порядку порівняння;
· Object max(Collection з, Comparator com) і Object min(Collection з, Comparator com) - повернення максимального або мінімального елементу колекції відповідно до порядку, заданого за допомогою компаратора;
· void reverse(List l) - переставляє елементи списку в зворотному порядку;
· void shuffle(List l) - перемішує елементи списку з використанням генератора випадкових чисел за умовчанням;
· void shuffle(List l, Random rnd) - перемішує елементи списку з використанням заданого генератора випадкових чисел;
· List singletonList(Object про) - повертає список, що містить тільки даний об'єкт;
· Map singletonMap(Object key, Object value) - повертає відображення, що містить тільки даний ключ і дане значення;
· void sort(List l) і void sort(List l, Comparator з) - сортує список за збільшенням відповідно до природного порядку або з використанням компаратора;
· Collection synchronizedCollection(Collection з), List synchronizedList(List l), Map synchronizedMap(Map m), Set synchronizedSet(Set s), SortedSet synchronizedSortedSet(SortedSet ss) і SortedMap synchronizedSortedMap(SortedMap sm) - створюють синхронізовані (не залежні від потоків) екземпляри відповідних типів колекцій;
· Collection unmodifiableCollection(Collection з), List unmodifiableList(List l), Map unmodifiableMap(Map m), Set unmodifiableSet(Set s), SortedSet unmodifiableSortedSet(SortedSet ss) і SortedMap unmodifiableSortedMap(SortedMap sm) - створюють незмінні екземпляри відповідних типів колекцій.
Індивідуальне завдання
Варіант 15
Створіть додаток Swing для пошуку книг в бібліотечному каталозі по заданому критерію. Записи в списку є об'єктами класу HashMap, де ключем є індекс ISBN книги (ціле число), а значенням - об'єкт, що містить найменування книги, ФІО автора, видавництво (типу String), рік видання (типу int) і ціну книги (типу float). Вікно додатку містить список, що розкривається, для введення критерію пошуку: по підрядку в найменуванні книги, ФІО автора, по видавництву або року видання і текстове поле для введення значення пошуку. Пошук книги виконується при натисненні кнопки "Пошук". Перший результат пошуку виводиться в шість текстових полів: індексу ISBN, найменування книги, ФІО автора, видавництва, року видання і ціни. При натисненні кнопки ">" виводиться наступний запис, а при натисненні кнопки "<" - попередня. Якщо книга не знайдена або список книг, що виводяться, вичерпаний, в текстовому полі для індексу ISBN виводиться символ "*".
Код програми
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class lab8 extends JFrame
{
public class value
{
String BookName=new String();
String AutorName=new String();
String PublisherName=new String();
int date;
float cost;
public value(String BookName,String AutorName,String PublisherName,int date,float cost)
{
this.BookName=BookName;
this.AutorName=AutorName;
this.PublisherName=PublisherName;
this.date=date;
this.cost=cost;
}
public String toString()
{
return this.BookName + " " + this.AutorName + " " + this.PublisherName + " " + this.date + " " + this.cost;
}
public String getBookName(){return this.BookName;}
public String getAutorName(){return this.AutorName;}
public String getPublisherName(){return this.PublisherName;}
public int getDate(){return this.date;}
public String getDatetoString(){return ""+this.date;}
public float getCost(){return this.cost;}
public String getCosttoString(){return ""+this.cost;}
}
JComboBox CriteriaChoice = new JComboBox();
int flagsearch=0;
JTextField SearchJTextField = new JTextField();
JButton SearchJButton = new JButton("Пошук");
JTextField OutputJTextFields[]=new JTextField[6];
JButton Backvard = new JButton("<");
JButton Fovard = new JButton(">");
JLabel tmplabel = new JLabel();
StreamTokenizer WorkFileStreamTokenizer;
HashMap<Integer,value> MainHashMap = new HashMap<Integer,value>();
Object MainHashMapArray[];
int ii;
public void showFields(Map.Entry<Integer,value>me)
{
OutputJTextFields[0].setText(""+me.getKey());
OutputJTextFields[1].setText(me.getValue().getBookName());
OutputJTextFields[2].setText(me.getValue().getAutorName());
OutputJTextFields[3].setText(me.getValue().getPublisherName());
OutputJTextFields[4].setText(""+me.getValue().getDate());
OutputJTextFields[5].setText(""+me.getValue().getCost());
}
public lab8(String name)
{
try
{
WorkFileStreamTokenizer = new StreamTokenizer(new FileReader("E:\\Library.txt"));
int ISBN;
String BookName=new String();
String AutorName=new String();
String PublisherName=new String();
int date;
float cost;
int i=WorkFileStreamTokenizer.nextToken();
for(i=0;i!=StreamTokenizer.TT_EOF;)
{
ISBN = (int)WorkFileStreamTokenizer.nval;
i=WorkFileStreamTokenizer.nextToken();
BookName = WorkFileStreamTokenizer.sval;
i=WorkFileStreamTokenizer.nextToken();
AutorName = WorkFileStreamTokenizer.sval;
i=WorkFileStreamTokenizer.nextToken();
PublisherName = WorkFileStreamTokenizer.sval;
i=WorkFileStreamTokenizer.nextToken();
date = (int)WorkFileStreamTokenizer.nval;
i=WorkFileStreamTokenizer.nextToken();
cost = (float)WorkFileStreamTokenizer.nval;
i=WorkFileStreamTokenizer.nextToken();
MainHashMap.put(ISBN,new value(BookName,AutorName,PublisherName,date,cost));
}
}
catch(IOException IOE){};
MainHashMapArray = MainHashMap.entrySet().toArray();
setTitle(name);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(new BorderLayout());
setSize(600,180);
setLocation(0,0);
CriteriaChoice.addItem("Search by Name");
CriteriaChoice.addItem("Search by Autor");
CriteriaChoice.addItem("Search by Publisher");
CriteriaChoice.addItem("Search by Date");
CriteriaChoice.addItem("Search by Cost");
CriteriaChoice.addItemListener
(
new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange()==ItemEvent.SELECTED)
{
if(e.getItem().toString()=="Search by Name")flagsearch=0;
else if(e.getItem().toString()=="Search by Autor")flagsearch=1;
else if(e.getItem().toString()=="Search by Publisher")flagsearch=2;
else if(e.getItem().toString()=="Search by Date")flagsearch=3;
else if(e.getItem().toString()=="Search by Cost")flagsearch=4;
}
}
}
);
CriteriaChoice.setSize(495,20);
CriteriaChoice.setLocation(0,0);
add(CriteriaChoice);
SearchJTextField.setSize(493,20);
SearchJTextField.setLocation(0,30);
add(SearchJTextField);
for(int i=0,x=0;i<6;i++,x+=100)
{
OutputJTextFields[i]=new JTextField();
OutputJTextFields[i].setSize(100,20);
OutputJTextFields[i].setLocation(x,90);
add(OutputJTextFields[i]);
}
SearchJButton.setSize(100,20);
SearchJButton.setLocation(0,60);
SearchJButton.addActionListener
(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
ii=0;
Set<Map.Entry<Integer,value>>set=MainHashMap.entrySet();
for(Map.Entry<Integer,value>me:set)
{
ii++;
if((flagsearch==0)&&(me.getValue().getBookName().equals(SearchJTextField.getText().trim())))
{
showFields(me);
break;
}
else if((flagsearch==1)&&(me.getValue().getAutorName().equals(SearchJTextField.getText().trim())))
{
showFields(me);
break;
}
else if((flagsearch==2)&&(me.getValue().getPublisherName().equals(SearchJTextField.getText().trim())))
{
showFields(me);
break;
}
else if((flagsearch==3)&&(me.getValue().getDatetoString().equals(SearchJTextField.getText().trim())))
{
showFields(me);
break;
}
else if((flagsearch==4)&&(me.getValue().getCosttoString().equals(SearchJTextField.getText().trim())))
{
showFields(me);
break;
}
else
{
OutputJTextFields[0].setText("*");
OutputJTextFields[1].setText("*");
OutputJTextFields[2].setText("*");
OutputJTextFields[3].setText("*");
OutputJTextFields[4].setText("*");
OutputJTextFields[5].setText("*");
}
}
ii--;
}
}
);
add(SearchJButton);
Backvard.setSize(100,20);
Backvard.setLocation(0,120);
Backvard.addActionListener
(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(ii>=0)ii--;
if(ii<0)
{
OutputJTextFields[0].setText("*");
OutputJTextFields[1].setText("*");
OutputJTextFields[2].setText("*");
OutputJTextFields[3].setText("*");
OutputJTextFields[4].setText("*");
OutputJTextFields[5].setText("*");
}
else showFields((Map.Entry<Integer,value>)MainHashMapArray[ii]);
}
}
);
add(Backvard);
Fovard.setSize(100,20);
Fovard.setLocation(100,120);
Fovard.addActionListener
(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(ii<=MainHashMapArray.length-1)ii++;
if(ii>MainHashMapArray.length-1)
{
OutputJTextFields[0].setText("*");
OutputJTextFields[1].setText("*");
OutputJTextFields[2].setText("*");
OutputJTextFields[3].setText("*");
OutputJTextFields[4].setText("*");
OutputJTextFields[5].setText("*");
}
else showFields((Map.Entry<Integer,value>)MainHashMapArray[ii]);
}
}
);
add(Fovard);
add(tmplabel);
show();
}
public static void main(String args[])
{
new lab8("Lab 8");
}
}
Результати виконання
Тестовий файл
Library.txt
1 a a a 2001 10.0
2 b b b 2002 20.0
3 c c c 2003 30.0
4 d e f 2007 28.95
5 dd ee ff