Java Programozás 7. Ea: A java.util csomag. A svájci bicska

Hasonló dokumentumok
Collections. Összetett adatstruktúrák

Programozási nyelvek Java

Programozási technológia

Generikus osztályok, gyűjtemények és algoritmusok

Java és web programozás

Java és web programozás

Reader /Writer InputStreamReader, OutputStreamWriter

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

Generikus Típusok, Kollekciók

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

OOP: Java 8.Gy: Abstract osztályok, interfészek

Tömbök, kollekciók és egyéb alaposztályok

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Programozási nyelvek Java

Java tutorial. Object. Nehany alaposztaly, amit ismerni illik. tostring. equals vs. ==

Kivételkezelés, naplózás. Exception handling, logging

Programozási nyelvek Java

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Magas szintű programozási nyelvek 2 Előadás jegyzet

Segédanyag: Java alkalmazások gyakorlat

Programozás I. 8. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

.Net adatstruktúrák. Készítette: Major Péter

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Programozási nyelvek II.: JAVA

Java osztálykönyvtár és használata

Programozási technológia

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

Programozási nyelvek II.: JAVA

Java Programozás 3. Gy: Java GUI. Swing, AWT

Globalizáció, Lokalizáció

Java programozási nyelv 5. rész Osztályok III.

OOP: Java 8.Gy: Gyakorlás

JAVA SE/ME tanfolyam tematika

ZH mintapélda. Feladat. Felület

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

C#, OOP. Osztályok tervezése C#-ban

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Abstract osztályok és interface-ek. 7-dik gyakorlat

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

7. K: JAVA alapok Konzultáció

OOP: Java 5.Gy: Osztály, referencia, konstruktor

OOP: Java 4.Gy: Java osztályok

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Segédanyag: Java alkalmazások gyakorlat

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Java programozási nyelv

Elemi adatszerkezetek

C++ Standard Template Library (STL)

Java Programozás 11. Ea: MVC modell

Generikusok, Collections Framework JAVA PROGRAMOZÁS 5. GYAKORLAT

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Programozási nyelvek Java

Programozási nyelvek Java

Segédanyag: Java alkalmazások gyakorlat

Szoftvertechnolo gia gyakorlat

Osztályok. 4. gyakorlat

JNDI - alapok. Java Naming and Directory Interface

Fejlett programozási nyelvek C++ Iterátorok

Java Programozás 1. Gy: Java alapok. Ismétlés ++

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

C# osztályok. Krizsán Zoltán

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Felhasználó által definiált adattípus

Imperatív programozás

Java Programozás 8. Gy: Java alapok. Adatkezelő 4.rész

Programozási nyelvek II.: JAVA, 4. gyakorlat

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Java programozási nyelv 6. rész Java a gyakorlatban

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

C++ programozási nyelv

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

3. Osztályok II. Programozás II

Programozás I. Második ZH segédlet

Adattípusok, vezérlési szerkezetek. Informatika Szabó Adrienn szeptember 14.

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Újdonságok a Java nyelvben

JAVA PROGRAMOZÁS 3.ELŐADÁS

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Programozási nyelvek II.: JAVA, 11. gyakorlat

Szoftvertechnológia alapjai Java előadások

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Programozási nyelvek és módszerek Java Thread-ek

Osztálytervezés és implementációs ajánlások

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Osztálytervezés és implementációs ajánlások

Programozási nyelvek Java

Láncolt lista Bináris keresőfa Gráf Hasító táblázat. Programozás II. labor 2. rész (Adatszerkezetek)

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

Adatbázisok webalkalmazásokban

Átírás:

Java Programozás 7. Ea: A java.util csomag A svájci bicska 117/1 B ITv: MAN 2018.02.05

A java.util csomag Tartalma: Gyűjtemények Property, preferencia Dátum, idő kezelés Nemzetköziség Erőforrás kezelés Logolás Egyebek 117/2

117/3

Gyűjtemény keretrendszer A gyűjtemények -tárolók, konténerek, kollekciók- olyan típuskonstrukciós eszközök, melynek célja egy vagy több típusba tartozó objektumok memóriában történő összefoglaló jellegű tárolása, manipulálása és lekérdezése. A gyűjtemény keretrendszer (Java Collections Framework, JCF) egy egységes architektúra, ami a gyűjtemények használatára és manipulálására szolgál. 117/4

Gyűjtemény keretrendszer Jellemzők: Csökkenti a fejlesztési időt Mivel kész adatstruktúrák és algoritmusok állnak rendelkezésünkre, a Gyűjtemény keretrendszer lehetővé teszi, hogy a program fontosabb részével foglalkozzunk, ahelyett, hogy alacsonyszintű programozással kelljen foglalkoznunk. Növeli a programozás sebességét és minőségét A JCF gyors és jó minőségű algoritmus-, és adatstruktúraimplementációkkal rendelkezik. A különböző implementációk minden egyes interfésznél felcserélhetők, így a programokat könnyen össze lehet hangolni a gyűjtemény implementációkkal. 117/5

Gyűjtemény keretrendszer Jellemzők: 117/6 Megengedi az együttműködést a nem kapcsolódó API-k között Ha két különböző függvénykönyvtár nem illeszthető egymáshoz közvetlenül, akkor lehet akár a keretrendszer a közös nevező az illesztés megteremtése érdekében. Csökkenti az új API-k használatának és tanulásának nehézségét Régen minden egyes API-nál egy kis segéd API-t készítettek arra, hogy manipulálja az egyes gyűjteményeket. Kevés összefüggés volt az erre a célra készült gyűjtemények segéd API-jai között, így különkülön meg kell tanulni azokat, így könnyen hibát ejthetünk ezek használatával. Az általános gyűjtemény interfészek megjelenésétől ez a probléma már a múlté.

Gyűjtemény keretrendszer Jellemzők: Megkönnyíti az új API-k tervezését A tervezőknek és a kivitelezőknek nem kell újra kidolgozni az API-t, valahányszor készítenek egy gyűjteményekre alapozott API-t, hanem az általános gyűjtemény interfészt használhatják. Elősegíti a szoftver újrafelhasználhatóságát Az gyűjtemény interfészekkel összhangba hozott új adatstruktúrák természetesen újra felhasználhatók. Hasonlóan, új algoritmus fejlesztésekor könnyen hozzákapcsolható lesz az összes létező eddigi megvalósításhoz. 117/7

Gyűjtemény keretrendszer Tartalma: Öt adatmodell (halmaz, lista, sor, kétvégű sor, map) műveleteit leíró interfészeket, Ezen modellek néhány konkrét megvalósítását, Bejárókat (iterátorok), Néhány algoritmust, Az adatszerkezetek szinkronizált használatához szükséges módozatokat. A használhatóság érdekében az összes interfész, illetve ezek implementációja generikus típus. Ez egyben azt is jelenti, hogy elemi típust csak becsomagolva tudunk gyűjteményben tárolni. 117/8

Gyűjtemény keretrendszer Adatmodellek: Halmaz: A matematikai halmaz fogalomnak felel meg. Nem tartalmaz duplikált elemeket, az elemek sorrendje nem feltétlenül meghatározott. Lista (szekvencia): Az elemeket egy index (sorszám) segítségével is elérhetjük. Tartalmazhat duplikált elemeket. Sor (Queue): FIFO sor. Az új elem a sor végére, kivenni elemet a sor elejéről. Kétvégű sor (Deque): Egy mindkét végén manipulálható sor. Használható veremként is. Map: Kulcs-érték párok tárolására. A kulcsok egyediek kell legyenek. 117/9

Gyűjtemény keretrendszer Négy további adatszerkezet: Rendezett halmaz: Néhány olyan extra funkció, ami az elemek rendezettségét használja ki. "Navigable" halmaz: Egy rendezett halmaz még további funkciókkal. Rendezett map: A kulcs-érték párok a kulcs szerint rendezve tárolódnak. Navigable map: Rendezett map még további funkciókkal. A régebbi adatszerkezeteket úgy módosították, hogy igazodjon a Collection Framework-ben definiáltakhoz, így azok is használhatóak. 117/10

Gyűjtemény keretrendszer Collection interface: A map-ek kivételével a többi adatmodellt megvalósító interfészek közös őse. Közvetlen megvalósítása nincs, csak abstract implementációi vannak. Nem minden metódusát kötelező megvalósítani. Azok a metódusai, amelyek opcionálisak úgy vannak deklarálva, hogy dobhatnak UnsupportedOperationException-t. Collection Map Set List Queue SortedMap 117/11 SortedSet

Gyűjtemény keretrendszer Collection interface tartalma: Nem opcionális elemek: Szeretnék ha az implementáció készítők felüldefiniálnák: boolean equals(object o) int hashcode() Elemek száma: int size() Üres-e: boolean isempty() Tartalmazás vizsgálat: boolean contains(object element) 117/12 Iterátor készítés: Iterator<E> iterator() Elemek tömbként kinyerése: Object[] toarray() <T> T[] toarray(t[] a)

Gyűjtemény keretrendszer Collection interface tartalma: Opcionális elemek: Elem hozzáadása: boolean add(e element) Elem törlése: boolean remove(object element) Tartalmazás vizsgálat: boolean containsall(collection<?> c) Több elem hozzáadása: boolean addall(collection<? extends E> c) Több elem törlése: boolean removeall(collection<?> c) boolean retainall(collection<?> c) Összes elem törlése: void clear() 117/13

Gyűjtemény keretrendszer Halmaz (Set) interface 117/14 Nem tartalmazhat duplikált elemeket. Azaz nem lehet két olyan eleme, amelyre igaz, hogy e1.equals(e2). Az add metódus hamisat ad ha már van olyan elem a halmazban. Tartalma: ugyanaz, mint Collection interface-é. A halmazműveletek: Elem betétele (add), kivétele (remove), tartalmazás vizsgálat (contains), részhalmaz vizsgálat (containsall), unió (addall), metszet (retainall), különbség (removeall)

Gyűjtemény keretrendszer Rendezett halmaz (SortedSet) interface 117/15 A Set leszármazottja. Rendezettség lehet természetes sorrend vagy Comparator alapján (lásd később) Plussz tartalom: Részhalmaz kinyerések: SortedSet<E> subset(e fromelement, E toelement) SortedSet<E> headset(e toelement) SortedSet<E> tailset(e fromelement) Első, utolsó elem kinyerés: E first() E last() Comparator lekérdezés: Comparator<? super E> comparator()

Gyűjtemény keretrendszer Navigálható halmaz (NavigableSet) interface A SortedSet leszármazottja. Plussz tartalma részletezés nélkül: legkisebb elem, legnagyobb elem, egy megadott elemtől nagyobb következő elem, egy megadott elemet megelőző elem, egy adott elemtől nagyobb (kisebb) elemek részhalmaza, stb. 117/16

Gyűjtemény keretrendszer Halmaz implementációk: 117/17 HashSet: Hash táblás tároláson alapuló megvalósítás. A leggyorsabb halmaz megvalósítás. Elemek sorrendje nem értelmezhető, ismételt bejárás más sorrend. A hash táblás tárolásból adódóan létrehozáskor célszerű megadni kezdő kapacitást és load faktor-t. A Set-hez képest nem definiál plussz funkciókat. LinkedHashSet: Hash táblás és láncolt listás tárolás együttes alkalmazása. Valamivel lassabb, mint a HashSet, de az elemek bejárási sorrend állandó (a beszúrási sorrend), valamint az elemek bejárása is gyorsabb. Funkciói megegyeznek a HashSet-tel.

Gyűjtemény keretrendszer Halmaz implementációk: TreeSet: Kiegyensúlyozott fán tárol. A leglassabb halmaz implementáció, de a SortedSet és a NavigableSet interface-ket is implementálja vagyis az elemek sorrendje kezelhető. EnumSet: Egy speciális halmaz, amely enum elemeket tartalmazhat és plussz funkciókkal rendelkezik az enum elemeinek kezeléséhez. Egyéb implementációk: nem részei a CF-nek. Többnyire a konkurens hozzáférés támogatásával kapcsolatosak. 117/18

Gyűjtemény keretrendszer Bejárók (Iterator, ListIterator) 117/19 A Collection alapú gyűjtemények elemeinek bejárására valók. Az iterátor kinyerése a Collection-ban deklarált Iterator iterator() metódussal. A ListIterator az Iterator leszármazottja. Csak a List-ek esetén használható. Kinyerése a ListIterator listiterator() metódussal. Iterator tartalma: boolean hasnext() igaz, ha van következő elem. E next() : a következő elemet adja, ha nincs, akkor kivételt dob. void remove(): opcionális, törli a next()-el előzőleg megkapott elemet.

Gyűjtemény keretrendszer Bejárók (Iterator, ListIterator): 117/20 A ListIterator tartalma: ua. mint Iterator, egyéb metódusok: boolean hasprevious() E previous() : visszafele bejárás int nextindex() int previousindex() : visszaadja az indexét a következő vagy előző elemnek. void set(e e): opcionális, megváltoztatja az aktuális elemet (utoljára visszaadott) void add(e e): opcionális, beszúr az aktuális elem után Bejárók (Enumerator): Egy régebbi bejáró az Iterator-ral egyenértékű, de hosszabb metódusneveket használ.

Gyűjtemény keretrendszer Bejárás: (c egy Collection fajta) Iterator<E> it = c.iterator(); while (it.hasnext()) { E elem = it.next(); //műveletek elemmel Vagy: for (E elem : c) { //műveletek elemmel Collection módosítása bejárás közben: csak a bejáró metódusaival lehetséges, különben hiba keletkezik. while (it.hasnext()) { c.remove(objektum); //hiba!! System.out.println(it.next()); 117/21

Példakód HashSet import java.util.hashset; import java.util.iterator; public class Util_1 { public static void main(string[] args) { HashSet<String> set = new HashSet<String>(); set.add("alma"); set.add("barack"); set.add("ananász"); set.remove("barack"); //equals alapján keres set.add("szilva"); set.add("málna"); set.add("alma"); //nem rakja bele, false vissza System.out.println("List 1:"); for (String elem : set) System.out.println(elem); 117/22

Példakód HashSet System.out.println("List 2:"); Iterator<String> it = set.iterator(); while (it.hasnext()) System.out.println(it.next()); String[] st = new String[set.size()]; //elemek tömbbe rakása set.toarray(st); System.out.println("List 3:"); for (String elem : st) System.out.println(elem); it = set.iterator(); System.out.println("Delete:"); while (it.hasnext()) { String elem = it.next(); if (elem.startswith("a")) it.remove(); System.out.println("List 4:"); for (String elem : set) System.out.println(elem); 117/23

public class Employee implements Comparable<Employee> { private String name; private int age; Példakód SortedSet public Employee(String name, int age) { super(); this.name = name; this.age = age; public String getname() { return name; public void setname(string name) { this.name = name; public int getage() { return age; public void setage(int age) { this.age = age; public int compareto(employee o) { return this.age - o.getage(); 117/24

Példakód SortedSet import java.util.iterator; import java.util.sortedset; import java.util.treeset; public class EmpSortedSet { public static void main(string[] args) { SortedSet set = new TreeSet(); set.add(new Employee("Béla", 60)); set.add(new Employee("Eszmeralda", 50)); set.add(new Employee("Rómeó", 10)); set.add(new Employee("Ödön", 20)); set.add(new Employee("Hümér", 40)); set.add(new Employee("Lujza", 30)); 117/25 System.out.println("Set after sorting:"); Iterator it = set.iterator(); while (it.hasnext()) { Employee epm = (Employee) it.next(); System.out.println("Employee "+epm.getname()+ ", his age: "+epm.getage());

Példakód SortedSet System.out.println("\nFirst Employee: " + ((Employee)set.first()).getName()); System.out.println("Last Employee: " + ((Employee)set.last()).getName()); System.out.println("\nheadSet(-30) result:"); SortedSet headset = set.headset(new Employee("Lujza", 30)); Iterator headsetit = headset.iterator(); while (headsetit.hasnext()) { Employee epm = (Employee) headsetit.next(); System.out.println("Employee " + epm.getname() + " his age: " + epm.getage()); 117/26

Példakód SortedSet System.out.println("\nsubSet(10-50) result:"); SortedSet subset = set.subset(new Employee("Rómeó", 10), new Employee("Eszmeralda", 50)); Iterator subsetit = subset.iterator(); while (subsetit.hasnext()) { Employee epm = (Employee) subsetit.next(); System.out.println("Employee " + epm.getname() + " his age: " + epm.getage()); 117/27 System.out.println("\ntailSet(40-) result:"); SortedSet tailset = set.tailset(new Employee("Hümér", 40)); Iterator tailsetit = tailset.iterator(); while (tailsetit.hasnext()) { Employee epm = (Employee) tailsetit.next(); System.out.println("Employee " + epm.getname() + " his age: " + epm.getage());

Gyűjtemény keretrendszer Lista (List) interface 117/28 Tartalma: Ua., mint Collection. További lehetőségek: Nem opcionális elemek: Elérés index alapján: E get(int index) Elem keresése: int indexof(object o) int lastindexof(object o) Egy többet tudó iterátor (a ListIterator) kinyerése: ListIterator<E> listiterator() ListIterator<E> listiterator(int index) Rész lista kinyerése: List<E> sublist(int from, int to)

Gyűjtemény keretrendszer Lista (List) interface Opcionális elemek: Adott indexű elem felülírása: E set(int index, E element) Elem beszúrása: void add(int index, E element) Adott indexű elem törlése: E remove(int index) Több elem beszúrása: boolean addall(int index, Collection<? extends E> c) 117/29

Gyűjtemény keretrendszer Lista implementációk: ArrayList: 117/30 Dinamikus tömb tárolású. Fontos jellemzője a kezdő kapacitás és a növekmény. A List interfésze opcionális elemeit is megvalósítja, nem definiál további funkcionalitást. Általában gyorsabb, mint a LinkedList, főleg indexes elérés használata esetén. LinkedList: Láncolt lista tárolású. A List interfészen kívül megvalósítja a Queue és Deque interfészeket is, tehát sorként és veremként is használható. Sok elem esetén a hozzáadás, törlés gyorsabb, mint az ArrayList.

Gyűjtemény keretrendszer Lista implementációk: Vector: Nem része a gyűjtemény keretrendszernek. Egy korábbi megvalósítás, amelyet utólag módosítottak úgy, hogy implementálja a List-et. Megfelel egy ArrayList-nek, amely szinkronizált metódusokkal rendelkezik. Stack: Szintén egy régebbi megvalósítás, a Vector leszármazottja. További verem használati funkciók. Helyette a Deque implementációi célszerűek. Egyéb megvalósítások: léteznek, nem részei a CF-nek. 117/31

Példakód ArrayList import java.util.arraylist; public class ArrayListExample { public static void main(string args[]) { ArrayList<String> arrl = new ArrayList<String>(); arrl.add("albertin"); arrl.add("helka"); arrl.add("cinnia"); arrl.add("stella"); arrl.add("abdon"); System.out.println("Current elements:"+arrl); System.out.println("Current 2. element:"+arrl.get(1)); System.out.println("\nIndex of Cinnia: "+arrl.indexof("cinnia")); System.out.println("Helka is in array: "+arrl.contains("helka")); arrl.set(2, "Flamina"); System.out.println("Current elements:"+arrl); 117/32

Példakód ArrayList arrl.add(0, "Riza"); arrl.add(1, "Jarmila"); System.out.println("\nCurrent elements:"+arrl); System.out.println("Current 2. element:"+arrl.get(1)); arrl.remove("damáz"); //Nem dob hibát! arrl.remove("helka"); //Indexek módosulnak! System.out.println("\nCurrent elements:"+arrl); System.out.println("Current 2. element:"+arrl.get(1)); arrl.remove(1); System.out.println("\nCurrent elements:"+arrl); System.out.println("Current 2. element:"+arrl.get(1)); for (int j = 0; j < arrl.size(); j++) if (j == 1 j == 3) arrl.remove(j); //Hibás logika!! System.out.println("\nCurrent elements:"+arrl); 117/33

Gyűjtemény keretrendszer A FIFO sor (Queue) interface: Létezhetnek kapacitás korláttal rendelkező megvalósításai. Tartalma: A Collection-ból öröklődtek az elemek, módosult az add úgy hogy IllegalStateException-t dob, ha tele van a sor. boolean offer(e e) : ua, mint add csak nem kivételt dob ha tele van, hanem false az eredmény E element() : Visszaadja a sor elején levő elemet, kivételt dob, ha üres a sor. E peek() : ua. mint element(), csak null-t ad ha üres a sor E remove() : visszaadja és kitörli a sor elején levő elemet, kivételt dob, ha üres a sor E poll() : ua. mint remove, csak null-t ad ha üres a sor. 117/34

Gyűjtemény keretrendszer A Queue implementációi: LinkedList: Lásd korábban a listáknál 117/35 PriorityQueue: Egy kapacitás korlát nélküli sor, amelyben az elemek nem berakás sorrendjében, hanem egy megadott rendezettségi sorban vannak. A lista eleje mindig a rendezettségi sor eleje. További funkcionalitás: a Comparator (Lásd később összehasonlítás, rendezés) objektum lekérdezhető. ArrayDeque: Megvalósítás dinamikus tömbön. Az elemek sorrendje a berakási sorrend. Megvalósítja a Queue és a Deque interface-t is. Egyéb megvalósítások: nem részei a CF-nek.

Példakód Queue import java.util.linkedlist; import java.util.queue; public class QueueExample { public static void main(string args[]) { Queue<Integer> myq=new LinkedList<Integer>(); myq.add(1); myq.add(6); myq.add(3); System.out.println(myQ); int first=myq.poll(); System.out.println("First out: "+first); System.out.println(myQ); 117/36

Gyűjtemény keretrendszer A kétvégű sor (Deque) interface 117/37 Double Ended Queue. A Queue leszármazottja. Műveletei: Beszúrás: addfirst, offerfirst, addlast, offerlast, add==addlast, offer==offerlast, push==addfirst Kiolvasás törléssel: removefirst, pollfirst, removelast, polllast, remove==removefirst, poll==pollfirst, pop==removefirst Kiolvasás: getfirst, peekfirst, getlast, peeklast, element==getfirst, peek==peekfirst Kétvégű sor implementációk: LinkedList: már volt róla szó ArrayDeque: már volt róla szó

Példakód Queue import java.util.linkedlist; import java.util.deque; public class DequeExample { public static void main(string args[]) { Deque<Integer> dq=new LinkedList<Integer>(); dq.addlast(11); dq.addlast(16); dq.addfirst(42); dq.addfirst(45); 117/38 System.out.println(dq); System.out.println("Deque size : "+dq.size()); System.out.println("\nPeek Last Value : "+dq.peeklast()); System.out.println("Remove Last Value : "+dq.polllast()); System.out.println("Remove Last Value : "+dq.polllast()); System.out.println("Remove Last Value : "+dq.polllast()); System.out.println(dq);

Gyűjtemény keretrendszer Collection List Queue Set ArrayList PriorityQueue HashSet Stack Dequeue LinkedHashSet LinkedList ArrayDequeue SortedSet Vector TreeSet 117/39 Final Class Interface NavigableSet

Gyűjtemény keretrendszer A Map interface: 117/40 Kulcs-érték párok. Nem tartalmazhat duplikált kulcsot! Tartalma: V put(k key, V value); V get(object key); V remove(object key); boolean containskey(object key); boolean containsvalue(object value); int size(); boolean isempty(); void putall(map<? extends K,? extends V> m); void clear(); public Set<K> keyset(); public Collection<V> values(); public Set<Map.Entry<K,V>> entryset();

Gyűjtemény keretrendszer A SortedMap interface: A Map leszármazottja Az elemek rendezett tárolásához. A rendezettség természetes vagy Comparator alapján. Tartalma: Comparator<? super K> comparator(); SortedMap<K, V> submap(k fromkey, K tokey); SortedMap<K, V> headmap(k tokey); SortedMap<K, V> tailmap(k fromkey); K firstkey(); K lastkey(); 117/41

Gyűjtemény keretrendszer A NavigableMap interface: 117/42 A SortedMap leszármazottja További funkciók részletezés nélkül: ugyanazok, mint a NavigableSet esetén, de mindenből kettő létezik: pl. legkisebb elem helyett:» legkisebb kulcs kinyerése» legkisebb kulcsú kulcs-értékpár kinyerése legkisebb kulcsú elem, legnagyobb kulcsú elem, egy megadott kulcstól nagyobb kulcsú következő elem, illetve előző elem, egy adott kulcstól nagyobb (kisebb) kulcsú elemek részmap-je, stb.

Gyűjtemény keretrendszer A Map implementációi: HashMap: Hash táblás megvalósítás. Sebesség jó, elemek sorrendisége nincs. Plusz funkcionalitás nincs. LinkedHashMap: Hash tábla és láncolt lista tárolás. Beszúrási sorrend. Sebesség kicsivel kisebb. TreeMap: Kiegyensúlyozott fán tárol. A Map interface-n kívül megvalósítja a NavigableMap és a SortedMap interface-ket is. Tehát a sebesség kisebb, de rendezett elemeket kapunk. EnumMap: A kulcsok egy enum típus konstansai. WeakHashMap: A kulcsok gyenge referenciával. Ha egy kulcsra nincs külső referencia, törlődik. 117/43

Gyűjtemény keretrendszer A Map implementációi: IdentityHashMap: Speciális. Nem equals()-t használ egyezőségre, hanem ==-t HashTable: Nem tartozik a CF-hez. Egy korábbi megvalósítás utólag módosítva úgy, hogy implementálja a Map-et. Megfelel a HashMap-nek csak szinkronizált. Properties: Szintén régebbi gyűjtemény fajta. A HashTable leszármazottja. A kulcsok és az értékek csak String-ek lehetnek. Léteznek letárolással, visszatöltéssel kapcsolatos metódusai. Lásd még később. Egyéb megvalósítások: Léteznek, nem részei a CF-nek. 117/44

Java Map keretrendszer Map AbstractMap HashTable SortedMap HashMap Properties NavigableMap LinkedHashMap TreeMap 117/45 IdentityHashMap WeakHashMap EnumMap Final Class Interface

import java.util.map; import java.util.hashmap; public class HashMapExample { public static void main(string args[]) { HashMap<Integer,String> Hm=new HashMap<Integer,String>(); Hm.put(1,"Steven"); Hm.put(null,null); Hm.put(6,"Clark"); Hm.put(3,"Jack"); Hm.put(3,"Jack"); System.out.println(Hm); System.out.println("Item Removed : "+Hm.remove(1)); Hm.put(null,"Dorotea"); System.out.println(Hm); Példakód HashMap changekey(hm, null, 4); Print(Hm); public static void changekey (HashMap<Integer,String> hm, Integer key, Integer newkey){ Object obj = hm.remove(key); hm.put(newkey, (String)obj); public static void Print (HashMap<Integer,String> hm){ for(map.entry m:hm.entryset()) System.out.println("Key: "+m.getkey()+" Value= "+m.getvalue()); 117/46

Gyűjtemény keretrendszer Egyenlőség: A gyűjtemények mindegyike az elemek egyenlőségének vizsgálatához (contains, indexof, stb.) az elem equals() metódusát használja! Sorrendiség: Azoknál a gyűjteményeknél, ahol rendezettség van, vagy bármiféle kisebb, nagyobb reláció kétféle módon hasonlíthatunk össze elemeket: Természetes sorrend alapján, Comparator objektum alapján. 117/47

Gyűjtemény keretrendszer Természetes sorrend: Az elemnek implementálnia kell a java.lang.comparable interface-t, amely egyetlen metódust tartalmaz: int compareto(t m) A metódus természetes logika szerinti működése: x.compareto(y) <0, ha x < y x.compareto(y) >0, ha x > y x.compareto(y) ==0, ha x.equals(y) 117/48

Gyűjtemény keretrendszer Sorrend a Comparator objektum alapján: A sorrendiség megállapításához mindig meg kell adni egy java.util.comparator interfészt implementáló objektumot. Ennek előnye, hogy több különböző Comparator objektumom is lehet, tehát leht több rendező szempontom. Comparator tartalma: int compare(t o1, T o2) boolean equals(object o) 117/49

Gyűjtemény keretrendszer Algoritmusok 117/50 Számos algoritmust készítettek, amelyet gyűjtemények elemein lehet végrehajtani. Ezeket a Collections osztályba tették. Algoritmusok: Rendezés, Keverés, Minimum (maximum) keresés, Bináris keresés, Elemek sorrendjének megfordítása, Feltöltés egy értékkel, Másolás egy másik gyűjteménybe, Elemek felcserélése, stb.

Példakód Algoritmusok private static final Comparator<Alkalmazott> NEVCOMP = new Comparator<Alkalmazott>(){ public int compare(alkalmazott o1, Alkalmazott o2) { return o1.getnev().compareto(o2.getnev()); ; private static final Comparator<Alkalmazott> FIZCOMP = new Comparator<Alkalmazott>(){ public int compare(alkalmazott o1, Alkalmazott o2) { return (int)math.signum(o1.getfizetes()- o2.getfizetes()); ; Collections.sort(alkList, NEVCOMP); for (Alkalmazott alk : alklist) System.out.println(alk); Collections.sort(alkList, FIZCOMP); for (Alkalmazott alk : alklist) System.out.println(alk); 117/51

Teszt 1. Mekkora egy HashMap alapértelmezett kapacitása (mérete)? 20 16 12 10 1024 117/52

Teszt 2. Mi lesz a kód kimenete? import java.util.*; public class COL { public static void main(string a[]){ Map s = new HashMap(); s.put("1","one"); s.put("3","three"); s.put("2","two"); System.out.println(s); [java.util.hashmap@69d60e531] Valamilyen (előre nem definiálható sorrendben kiíródnak az adatok {1=one, 2=two, 3=three 117/53 {1=one, 3=three, 2=two

Teszt 3. Mi lesz a kód kimenete? import java.util.*; public class COL { public static void main(string a[]){ Map s = new LinkedHashMap(); s.put("1","one"); s.put("3","three"); s.put("2","two"); System.out.println(s); [java.util.hashmap@69d60e531] Valamilyen (előre nem definiálható sorrendben kiíródnak az adatok {1=one, 2=two, 3=three 117/54 {1=one, 3=three, 2=two

Teszt 4. Mi lesz a kód kimenete? import java.util.*; public class COL { public static void main(string a[]){ Map s = new Hashtable(); s.put("3","three"); s.put(null,null); s.put("1","one"); System.out.println(s); Fordítási hiba: index cannot null in java.util.hashtable Futási hiba: NullPointerException {null=null, 1=one, 2=two 117/55 {3=three, null=null, 1=one

Teszt 5. Lehet null értéket hozzáadni egy List-hez (listához)? IGEN NEM 117/56

Teszt 6. Melyik interfészt kell használnunk, ha olyan gyűjteményt akarunk készíteni, amelyikben egy kulcs azonosít egy értéket? SortedSet Map NavigableList NavigableSet 117/57

Teszt 7. Mi lesz a kód kimenete? import java.util.*; public class COL { public static void main(string a[]){ List<Integer> integer = new ArrayList<Integer>(); integer.add(1); integer.add(2); List<Number> number = (List)integer; System.out.println(number); Fordítási hiba: error ' ; ' excepted-new ArrayList<Integer> ^ Fordítási hiba: cannot find symbol class Number Futási hiba: ClassCastException 117/58 [1, 2]

Teszt 8. Mi lesz a kód kimenete? import java.util.*; public class ABC { public static void main(string[] a){ HashSet<String> hset = new HashSet<String>(); hset.add("b"); hset.add("c"); hset.add("a"); hset.add("b"); System.out.println(hset); 117/59 [B, C, A, B] [A, B, B, C] [A, B, C] [B, C, A]

Teszt 9. Az alábbi sor deklaráció helyes? Queue que = new Queue<String>; IGEN NEM 117/60

Teszt 10. Adott az alábbi kódrészlet. Mely utasítások helyesek (hiba nélkül végrehajthatók)? Queue<String> myq=new LinkedList<String>(); myq.add("a"); myq.add("c"); myq.add("h"); 117/61 System.out.println(myQ); System.out.println(myQ.element()); System.out.println(myQ.peek()); System.out.println(myQ.peekLast()); myq.remove(); myq.removeall(); System.out.println(myQ.size()); myq.addlast("w");

java.util.date 117/62 bybsalvador IT MAN Dali

Dátum, idő kezelés Date: Egy időpont miliszekundumos pontossággal. Legtöbb metódusa elavult, nem használatos. Használatos: Date(), equals(), tostring(), gettime(), settime() TimeZone: Absztrakt osztály időzónák kezeléséhez. SimpleTimeZone: A jelenleg használatos időzóna és téli nyári időszámítás megvalósítás. Calendar: Absztrakt osztály dátum, idő, naptár kezeléséhez. GregorianCalendar: A Calendar leszármazottja. Az összes dátum, idő, naptár kezelő funkció. 117/63

java.util.calendar Aktuális időpont lekérése: public static Calendar getinstence(); Metódusok: int get(int field_constant); void set(int field_constant, value_constant); Field Constants: ERA YEAR MONTH WEEK_OF_YEAR DATE AM_PM WEEK_OF_MONTH DAY_OF_MONTH 117/64 Field Constants: Value Constants: HOUR SUNDAY to SATURDAY DAY_OF_YEAR JANUARY to DECEMBER DAY_OF_WEEK AM, PM MINUTE HOUR_OF_DAY MILLISECOND SECOND DAY_OF_WEEK_IN_MONTH

Példakód import java.util.calendar; import java.util.date; import java.util.gregoriancalendar; import java.text.simpledateformat; public class DatumMuveletek { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm"); public static void main(string[] args) { System.out.println(aktualisDatum()); System.out.println(DtoS(aktualisDatum())); Date d1=datummegadottadatokkal2(2020,11,29,5,17,14); System.out.println(DtoS(d1)); private static Date aktualisdatum() { return new Date(); private static String DtoS (Date d) { return sdf.format(d).tostring(); private static Date CaltoD (Calendar cal) { return cal.gettime(); 117/65

Példakód private static Calendar DtoCal (Date date) { Calendar calendar = Calendar.getInstance(); calendar.settime(date); return calendar; private static Calendar aktualisdatumcal() { return Calendar.getInstance(); private static Date datummegadottadatokkal(int ev, int honap, int nap, int ora, int perc, int mp) { Calendar cal = Calendar.getInstance(); cal.set(ev, honap-1, nap, ora, perc, mp); return cal.gettime(); private static Date datummegadottadatokkal2(int ev, int honap, int nap, int ora, int perc, int mp) { Calendar cal = new GregorianCalendar(ev,honap-1,nap,ora,perc,mp); return cal.gettime(); 117/66

Példakód private static Calendar datumtocalendar(date d) { Calendar cal = Calendar.getInstance(); cal.settime(d); return cal; private static int[] datumreszei(date d) { int[] reszek = new int[6]; Calendar cal = datumtocalendar(d); reszek[0] = cal.get(calendar.year); reszek[1] = cal.get(calendar.month) + 1; reszek[2] = cal.get(calendar.day_of_month); reszek[3] = cal.get(calendar.hour_of_day); reszek[4] = cal.get(calendar.minute); reszek[5] = cal.get(calendar.second); return reszek; private static long ketdatumkulonbsegemasodpercben(date elso, Date masik) { long elsomilisec = datumtocalendar(elso).gettimeinmillis(); long masikmilisec = datumtocalendar(masik).gettimeinmillis(); return (elsomilisec - masikmilisec) / 1000; 117/67

Példakód private static Date datumevemegvaltoztatas(date datum, int ujev) { Calendar cal = datumtocalendar(datum); cal.set(calendar.year, ujev); return cal.gettime(); private static Date datumcsokkentve(date datum, int napok) { Calendar cal = datumtocalendar(datum); cal.add(calendar.day_of_year, -50); return cal.gettime(); private static boolean datumelsokisebbe(date d1, Date d2) { return d1.before(d2); 117/68

Példakód import java.util.*; public class GregCalDem { public static void main(string[] args) { GregorianCalendar cal = (GregorianCalendar)GregorianCalendar.getInstance(); System.out.println("" + cal.gettime()); int year = cal.get(gregoriancalendar.year); boolean isleapyear = cal.isleapyear(year); System.out.println(""+year+" is leap year:" + isleapyear); isleapyear = cal.isleapyear(2020); System.out.println("2020 is leap year:" + isleapyear); cal.add(gregoriancalendar.date, -5); System.out.println("Date:" + cal.gettime()); 117/69 cal.roll(gregoriancalendar.hour, 4); System.out.println("Date:" + cal.gettime());

Teszt 11. Az alábbi metódus kódja helyes? public String DateToString(Date d) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm"); return sdf.format.tostring(); IGEN NEM 117/70

Teszt 12. Az alábbi metódus kódja helyes? public Date CalendarToDate (Calendar cal) { return cal.getdate(); IGEN NEM 117/71

Teszt 13. Melyik osztály(oka)t kell importálni, hogy a kód megfelelően működjön! public String DateToString(Date d) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm"); return sdf.format(d).tostring(); 117/72 java.util.date java.util.simpledateformat java.util.dateformat java.util.textformat java.text.format java.text.simpledateformat

Teszt 14. Melyik osztály(oka)t kell importálni, hogy a kód megfelelően működjön! public Date CalendarToDate (Calendar cal) { return cal.gettime(); java.util.date java.util.calendar java.util.gregoriancalendar java.util.calendar.gregoriancalendar 117/73

Teszt 15. Melyik kód írja ki helyesen a dátumot? import java.util.calendar; import java.text.simpledateformat; public class ABC { public static void main(string[] a){ Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); String fd =??? System.out.println(fd); 117/74 format.sdf(cal.gettime()); sdf(cal.gettime()); sdf.format(cal.gettime()); format.sdf(cal.gettime()).tostring();

Teszt 16. Mit ír ki az alábbi kód? import java.util.calendar; public class ABC { public static void main(string[] a){ Calendar cal = Calendar.getInstance(); cal.set(calendar.hour, 73); cal.set(calendar.minute, 158); cal.set(calendar.second, 60); System.out.print(cal.get(Calendar.HOUR) + ":"); System.out.print(cal.get(Calendar.MINUTE) + ":"); System.out.print(cal.get(Calendar.SECOND)); 1:38:0 117/75 1:39:0 3:39:0 73:158:60 Egyéb időpontot

Teszt 17. Jelölje meg az aktuális dátum lekérésének összes helyes módját! Calendar cal = Calendar.getInstance(); Date date = new Date(); LocalDateTime now = LocalDateTime.now(); Calendar cal=null; cal.settime(new Date()); Date date=null; date=new Calendar().getTime(); Date date=null; date=new GregorianCalendar().getTime(); 117/76

Heló! Namastḕ! Hello! Hallo! Hola! 117/77 java.util.locale Nemzetköziség

Nemzetköziség Internationalization (i18n) Localization (l10n) Az internacionalizálás és a honosítás (más szavakkal kulturális beágyazás vagy nyelvi lokalizáció) olyan módszerek, melyekkel termékeket vagy szoftvereket viszünk át (adaptálunk) más, nem belföldi környezetbe, főként más országokba és kultúrákba. Programok esetén ezek azon elemek, amelyek függnek a nyelvi, régió környezettől: szám, dátum, idő, pénz formátumok szöveges részek (feliratok), szöveg sorrendiség egyéb interfész elemek: képek, hangok, multimédia elemek, méretek stb. 117/78

Nemzetköziség A nemzetköziségre felkészített program esetén a lokalizáció a program megváltoztatása nélkül mehet végbe. Megoldás: az adatok (szövegek, formátumok, stb.) nincsenek fixen beépítve a programba, hanem a programon kívül tárolódnak, minden lehetséges (szükséges) környezetre. A program az aktuális környezetnek megfelelőt fogja használni. A JVM átveszi a host-tól a felhasználó által beállított környezetet. Ez lesz az alapértelmezett környezet. A Javaban nem kötelező a teljes programban végig ugyanazt a környezetet használni, bármelyik környezetfüggő művelethez megadhatunk új környezetet. 117/79

Nemzetköziség A java.util.locale osztály Azonosít: egy nyelvet, földrajzi helyet, egyéb körülményt azaz egy környezetet. 117/80 Az első paraméter egy ISO-639 szerinti nyelvkód (pl. en, de, hu). A második paraméter egy ISO-3166 szerinti országkód (pl. GB, DE, HU). Harmadik paraméterként legtöbbször platformot szokás megadni (UNIX, WIN). Létrehozás a konstruktorral: Locale a = new Locale("de") //csak nyelvet azonosít Locale b = new Locale("de", "DE"); //nyelv és ország Locale b = Locale.GERMANY; //teljes azonosítás

Nemzetköziség Locale műveletei: Lekérdezni az alapértelmezettet: static Locale getdefault() Lekérdezni az összes elérhetőt: static Locale[] getavailablelocales() Beállítani az alapértelmezettet: static void setdefault(locale) Lekérdezni a részeit: getcountry(), getlanguage(), getvariant(), getdisplaylanguage(), stb. 117/81

Nemzetköziség Szám, dátum, idő, pénznem formátum beállítása A java.util.text csomagban található osztályokkal Szám, pénznem, százalék formázás: NumberFormat (abstract), DecimalFormat 1. lépés: A format objektum legyártása A NumberFormat osztály statikus metódusaival: Az aktuális Locale-hoz: NumberFormat getxxxinstance() Megadott Locale-hoz: NumberFormat getxxxinstance(locale) 117/82

Nemzetköziség Szám, pénznem, százalék formázás: A getxxxinstance-ban az XXX lehet: Integer: egész formázáshoz Number: valós formázáshoz Currency: pénznem formázáshoz Percent: százalék formázáshoz Például: NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMANY); 117/83

Nemzetköziség Szám, pénznem, százalék formázás: A DecimalFormat konstruktorával egy megadott pattern és az aktuális Locale szerint formázó objektumot kaphatunk. Például: NumberFormat nf = new DecimalFormat("#,##0.0"); Egy megadott Locale és megadott pattern formázóját felhasználva: Például: NumberFormat nf = NumberFormat.getNumberInstance(loc); DecimalFormat df = (DecimalFormat)nf; df.applypattern(pattern); 117/84

Nemzetköziség Szám, pénznem, százalék formázás: 2. lépés: Ha szükséges, állítsuk be a formázót Leggyakoribb beállítások: setgroupingused(boolean newvalue) setroundingmode(roundingmode roundmode) setminimumfractiondigits(int newvalue) 3. lépés: formázás vagy parse-olas Formázás a formázó objektum format metódusával String s = nf.format(1234567.123); Parse-olás a parse metódussal. 117/85

Nemzetköziség Szám, pénznem, százalék formázás: Lehetséges még a formátumban használt szimbólumokat is megváltoztatni (tizedes jel, ezres elválasztó jel, stb.) a DecimalFormatSymbols osztály segítségével. Példa: DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(loc); dfs.setdecimalseparator('.'); dfs.setgroupingseparator(','); DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(); df.setdecimalformatsymbols(dfs); System.out.println(df.format(1234567.123)); 117/86

Nemzetköziség Dátum, idő formázás: Kezelése: DateFormat, SimpleDateFormat A megfelelő Locale formátumainak lekérése: DateFormat getdateinstance() DateFormat gettimeinstance() DateFormat getdatetimeinstance() Paramétereik lehetnek a dátum stílus (rövid, hosszú, stb), idő stílus (rövid, hosszú, stb.), Locale. Használata hasonló a NumberFormat osztályhoz. 117/87

Nemzetköziség Dátum, idő formázás A dátum, idő megjelenítésben használt szimbólumok (pl. hónap nevek, nap nevek, stb.) a DateFormatSymbols osztállyal kezelhetőek. Példa: DateFormatSymbols dfs = new DateFormatSymbols(); String[] napok = {"Vas", "He", "Kedd", "Szer", "Csüt", "Pént", "Szomb"; dfs.setweekdays(napok); 117/88

Nemzetköziség Szöveg formázás A megjelenős szövegeket sem célszerű összefűzéssel előállítani. String s = "A kör kerülete: "+ker+", területe: "+ter; Ilyen összefűzéssel nem lehet megfelelően átfordítani más nyelvekre. Van nyelv pl., ahol a szövegben máshol helyezkedne el az adat. Használjuk a MessageFormat osztályt, amely lehetővé teszi, hogy egyetlen String-ben megadjuk a szöveget és az adatokat. Hasonló a printf-hez. 117/89

Nemzetköziség Szöveg formázás: példák: String s = MessageFormat.format("A kör kerülete: {0, number, területe: {0, number", ker, ter); String c = MessageFormat.format("Most {1,date,long és van {0,number feladat.", 2.34, new Date()); 117/90

Példakód Locale import java.util.date; import java.text.dateformat; import java.text.numberformat; import java.util.locale; public class Formats { public static void main(string[] args) { Locale defloc = Locale.getDefault(); 117/91 Print(defLoc); Print(new Locale("us", "US")); Print(new Locale("fr", "FR")); public static void Print (Locale loc){ System.out.println("\nLocale params: "+loc.tostring()); System.out.println("Language: "+loc.getdisplaylanguage(loc)); DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, loc); Date date = new Date(); String formatteddate = df.format(date); System.out.println("Date format: "+formatteddate); double x = 1234567.5663; NumberFormat nf = NumberFormat.getInstance(loc); System.out.println("Number format: "+nf.format(x));

Nemzetköziség Erőforrás kezelés Erőforrások: Locale-függő szövegek, adatok Kezelés: 1. Azonosítsuk a Locale-függő adatokat 2. Különítsük el a programtól, készítsünk belőlük minden szükséges Locale-hoz. (ResourceBundle) 3. A programban betöltjük és használjuk az éppen szükséges Locale-hoz tartozót. (ResourceBundle loading) A ResourceBundle absztrakt osztály, illetve ennek leszármazottai használhatók az elkülönített erőforrások tárolására. 117/92

Nemzetköziség Erőforrás kezelés A ResourceBundle osztálynak két leszármazottja van: PropertyResourceBundle: szöveges file-okban (.properties) tárolja az adatokat. Csak szöveges (szöveggé alakítható) adatok tárolására. ListResourceBundle: Osztályokban tárolja az adatokat. Bármilyen típusúak lehetnek. 117/93

Nemzetköziség Erőforrás kezelés Az erőforrások betöltése: A ResourceBundle statikus getbundle() metódusával, amelynek kötelező megadni az erőforráscsoport nevét és a locale-t. Ez megkeresi és betölti a megfelelő erőforrás file-t (osztályt). Például: Locale curloc=new Locale("hu","HU","UNIX"); ResourceBundle a = ResourceBundle.getBundle("Feliratok", curloc); 117/94

Nemzetköziség Erőforrás kezelés Keresési sor: Feliratok_hu_HU_UNIX, ha nincs Feliratok_hu_HU Feliratok_hu Feliratok_alapertnyelv_alapertorsz Feliratok_alapertnyelv Feliratok Ha egyik sincs, akkor MissingResourceException-t dob. A getbundle() először ilyen nevű osztályt keres, ha az nincs, akkor ilyen nevű.properties kiterjesztésű file-t keres. 117/95

Nemzetköziség Erőforrás kezelés 117/96 Betöltött erőforrás használata: Adott kulcsú elem kinyerése: String getstring(string kulcs) Object getobject(string kulcs) Kulcsok kinyerése: Set<String> keyset() A.properties file szerkezete: kulcsnév érték Az erőforrás szerkezetének lekérése: public Object[][] getcontents(); ahol a tömb egy sora a kulcsot és az értéket tartalmazza.

Nemzetköziség A fejlesztő eszközök (pl. eclipse, netbeans) képesek egy osztályt átalakítani erőforrás kezelést használóra, de csak a string-eket derítik fel és teszik ki erőforrás fileba. (externalize strings) Nem képesek szám, dátum stb. formázásokat átalakítani. Léteznek külön eszközök, amelyek igen! 117/97

Példakód ResourceBundle import java.util.locale; import java.util.resourcebundle; public class RBP { public static void main(string[] args) { Locale loc = Locale.getDefault(); ResourceBundle rb = ResourceBundle.getBundle("MyLabels"); Print(); Locale.setDefault(new Locale("en", "US")); Print(); Locale.setDefault(new Locale("fr", "FR")); Print(); public static void Print () { Locale loc = Locale.getDefault(); ResourceBundle rb = ResourceBundle.getBundle("MyLabels"); System.out.println("Say: how are you in "+loc.getcountry()+ " in "+loc.getdisplaylanguage(loc)+ " language: "+rb.getstring("how_are_you")); 117/98 MyLabels_hu_HU.properties how_are_you = Hogy vagy? MyLabels_en_US.properties how_are_you = How are you? MyLabels_fr_FR.properties how_are_you = Comment allez-vous?

Példakód Properties import java.io.fileoutputstream; import java.io.ioexception; import java.io.outputstream; import java.util.properties; public class PropApp1 { public static void main(string[] args) { Properties prop = new Properties(); OutputStream output = null; try { output = new FileOutputStream("config.properties"); prop.setproperty("database", "localhost"); prop.setproperty("dbuser", "BitMan"); prop.setproperty("dbpassword", "*#>^<#*"); prop.store(output, null); output.close(); catch (IOException io) {io.printstacktrace(); config.properties #Sun Feb 04 16:36:48 CET 2018 dbpassword=*\#>^<\#* database=localhost 117/99 dbuser=bitman

Példakód Properties import java.io.fileinputstream; import java.io.ioexception; import java.io.inputstream; import java.util.properties; public class PropApp2 { public static void main(string[] args) { Properties prop = new Properties(); InputStream input = null; try { input = new FileInputStream("config.properties"); prop.load(input); 117/100 System.out.println(prop.getProperty("database")); System.out.println(prop.getProperty("dbuser")); System.out.println(prop.getProperty("dbpassword")); input.close(); catch (IOException io) {io.printstacktrace();

Teszt 18. Melyik Locale megadás helyes? Locale loc = new Locale("hu"); Locale loc = new Locale("hu", "HU"); Locale loc = new Locale("HUNGARY"); Locale loc = Locale.HUNGARY; Locale loc = new Locale("hu", "HU", "Win"); Locale loc = Locale.UK; Locale loc = new Locale("xx", "XX"); Locale loc = Locale.getDefault(); 117/101

Teszt 19. Mi a tartalma egy.properties fájlnak? name = "Joe" number = 23 name = Joe number = 23 "name" = "Joe" "number" = "23" name=joe number=23 "name" = Joe "number" = 23 name="joe" number="23" 117/102

Teszt 20. Hogyan olvassuk ki egy ResourceBundle (erőforrás) tartalmát? rb.getbundle("param"); rb.getparam("param"); rb.getproperties("param"); rb.getstring("param"); rb.getobject("param"); rb.getresource("param"); rb.get("param"); 117/103

Logolás java.util.logging 117/104

Logolás Naplózás. Egy program a végrehajtása alatt üzeneteket ír egy központi helyre (konzol, fájl). Az üzenetek lehetnek: felhasználói tevékenységek (bejelentkezés, kijelentkezés ), normál tevékenységek üzenetei (folyamat indítása, adat beírás ), figyelmeztetések (hibás adat beírása ), hibák (programhibák). Az üzenetek felhasználhatók: statisztikák készítéséhez, tevékenységek analizálásához, hibák kereséséhez, hibajavításhoz. 117/105

Logolás Javaban a java.util.logging csomag biztosítja a logolást, a Logger osztály használatával. Logger létrehozása: Logger(String name, String resourcebundlename) name: a logger neve resourcebundlename: nemzetközi erőforrás kezelő neve Értéke lehet null 117/106

Logolás Naplózási szint: az események 7 súlyossági kategóriába sorolhatók: 117/107 - + SEVERE WARNING INFO CONFIG FINE FINER FINEST Súlyos Figyelmeztető Információs Beállítási Jó Jobb Legjobb

Logolás A naplózási szint beállítása LOGGER.setLevel(szint); LOGGER.setLevel(Level.INFO); Azok az üzenetek naplózódnak, melyek legalább a beállított szint súlyosságával rendelkeznek. A példában az információs, a figyelmeztető és a súlyos szintű üzenetek naplózódnak. 117/108

Logolás Naplózás: logger.xxx("message"); Az xxx metódus az egyes szintek nevével egyezik meg. logger.setlevel(level.info); logger.severe("info Log"); logger.warning("info Log"); logger.info("info Log"); logger.finest("really not important"); Csak azok az üzenetek naplózódnak, amelyek legalább a beállított szinttel rendelkeznek! 117/109

Logolás A loggerek több handlerhez (kezelőhöz) is kapcsolódhatnak. A kezelő megkapja az üzenetet a naplózóból, és a beállított cél felé továbbítja. 117/110 ConsoleHandler: Az üzeneteket a konzolra írja ki FileHandler: Az üzeneteket fájlba írja ki Az INFO és a magasabb szintek automatikusan a konzolra kerülnek, de ez kikapcsolható: logger.setuseparenthandlers(false); A kezelő kikapcsolható a setlevel (Level.OFF) módszerrel, és bekapcsolható a setlevel() metódussal. A kezelők kimenete formázóval konfigurálható Rendelkezésre álló formázók: SimpleFormatter: Minden üzenetet szövegként generál XMLFormatter: XML-kimenetet hoz létre a naplóüzenetekhez

Példakód Logger import java.util.logging.*; import java.io.*; public class LogPrb { private static Logger logger = Logger.getLogger("LogPrb loger"); private static FileHandler fh; public static void main(string[] args) { makefilelogger("c:/java8/logprb.log"); logger.setlevel(level.info); logger.info("logger Name: "+logger.getname()); logger.warning("hiba!"); logger.info("program OK!"); logger.finest("lényegtelen megjegyzés."); public static void makefilelogger (String fnev) { try { fh = new FileHandler(fnev); logger.addhandler(fh); logger.setuseparenthandlers(false); SimpleFormatter formatter = new SimpleFormatter(); fh.setformatter(formatter); catch (SecurityException e) {e.printstacktrace(); catch (IOException e) {e.printstacktrace(); 117/111

Példakód Logger 117/112

Logolás A java.util.logging csomag (részlete) Logger Handler External System Filter Filter Formatter 117/113

Teszt 21. Melyik csomagban van a Logger osztály? java.util.logger java.util.logging java.util java.util.logger.logging 117/114

Teszt 22. Hogyan lehet írni egy megnyitott Logger fájlba? logger.info("data"); logger.warning("data"); logger.server("data"); logger.error("data"); logger.log("data"); logger.exception("data"); logger.finest("data"); 117/115

Teszt 23. Milyen formázók állnak rendelkezésre a logoláshoz? SimpleLogFormatter SimpleTextFormatter LogFileFormatter XMLFormatter SimpleFormatter HTMLFormatter 117/116

VÉGE VÉGE 117/117