B IT MAN117/2
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…
B IT MAN117/4
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.
B IT MAN117/5
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úra-
implementá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.
B IT MAN117/6
Gyűjtemény keretrendszer
Jellemzők:
– 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ön-
kü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é.
B IT MAN117/7
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.
B IT MAN117/8
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.
B IT MAN117/9
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.
B IT MAN117/10
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.
B IT MAN117/11
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
List
Map
SortedMapQueueSet
SortedSet
B IT MAN117/12
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)
• Iterátor készítés: Iterator<E> iterator()
• Elemek tömbként kinyerése:
– Object[] toArray()
– <T> T[] toArray(T[] a)
B IT MAN117/13
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()
B IT MAN117/14
Gyűjtemény keretrendszer
Halmaz (Set) interface
– 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)
B IT MAN117/15
Gyűjtemény keretrendszer
Rendezett halmaz (SortedSet) interface
– 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()
B IT MAN117/16
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.
B IT MAN117/17
Gyűjtemény keretrendszer
Halmaz implementációk:
– 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.
B IT MAN117/18
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.
B IT MAN117/19
Gyűjtemény keretrendszer
Bejárók (Iterator, ListIterator)
– A Collection alapú gyűjtemények elemeinek bejárására
valók.
– Az iterátor kinyerése a Collection-ban deklarált Iteratoriterator() metódussal.
– A ListIterator az Iterator leszármazottja. Csak a List-ek
esetén használható. Kinyerése a ListIteratorlistIterator() 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.
B IT MAN117/20
Gyűjtemény keretrendszer
Bejárók (Iterator, ListIterator):
– 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.
B IT MAN117/21
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
}
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.
Vagy:
while (it.hasNext()) {c.remove(objektum); //hiba!!System.out.println(it.next());
}
B IT MAN117/22
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);
B IT MAN117/23
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ásaset.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);
}}
B IT MAN117/24
public class Employee implementsComparable<Employee> {
private String name;private int age;
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(); }
}
Példakód – SortedSet
B IT MAN117/25
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));
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());}
B IT MAN117/26
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());}
B IT MAN117/27
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());}
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());}
}}
B IT MAN117/28
Gyűjtemény keretrendszer
Lista (List) interface
– 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)
B IT MAN117/29
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)
B IT MAN117/30
Gyűjtemény keretrendszer
Lista implementációk:
– ArrayList:
• 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 Dequeinterfé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.
B IT MAN117/31
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.
B IT MAN117/32
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);
B IT MAN117/33
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);}
}
B IT MAN117/34
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.
B IT MAN117/35
Gyűjtemény keretrendszer
A Queue implementációi:
– LinkedList: Lásd korábban a listáknál
– 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.
B IT MAN117/36
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);
}}
B IT MAN117/37
Gyűjtemény keretrendszer
A kétvégű sor (Deque) interface
– 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ó
B IT MAN117/38
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);
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);
}}
B IT MAN117/39
Gyűjtemény keretrendszer
Collection
List Queue
NavigableSet
HashSet
SortedSet
TreeSet
LinkedHashSet
Set
PriorityQueue
Dequeue
ArrayDequeue
ArrayList
LinkedList
Stack
Vector
Final Class Interface
B IT MAN117/40
Gyűjtemény keretrendszer
A Map interface:
– 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();
B IT MAN117/41
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();
B IT MAN117/42
Gyűjtemény keretrendszer
A NavigableMap interface:
– 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.
B IT MAN117/43
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.
B IT MAN117/44
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.
B IT MAN117/45
Java Map keretrendszer
NavigableMap
SortedMap
Map
LinkedHashMap
HashMap
HashTable
TreeMap
AbstractMap
Properties
IdentityHashMap WeakHashMap EnumMap
Final Class
Interface
B IT MAN117/46
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);
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());
}}
Példakód – HashMap
B IT MAN117/47
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.
B IT MAN117/48
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)
B IT MAN117/49
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)
B IT MAN117/50
Gyűjtemény keretrendszer
Algoritmusok
– 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.
B IT MAN117/51
Példakód – Algoritmusok
Collections.sort(alkList, NEVCOMP); for (Alkalmazott alk : alkList) System.out.println(alk);
Collections.sort(alkList, FIZCOMP); for (Alkalmazott alk : alkList) System.out.println(alk);
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());
}};
B IT MAN117/53
Teszt 2.
Mi lesz a kód kimenete?
[java.util.HashMap@69d60e531]
Valamilyen (előre nem definiálható sorrendben kiíródnak az
adatok
{1=one, 2=two, 3=three}
{1=one, 3=three , 2=two}
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);
} }
B IT MAN117/54
Teszt 3.
Mi lesz a kód kimenete?
[java.util.HashMap@69d60e531]
Valamilyen (előre nem definiálható sorrendben kiíródnak az
adatok
{1=one, 2=two, 3=three}
{1=one, 3=three , 2=two}
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);
} }
B IT MAN117/55
Teszt 4.
Mi lesz a kód kimenete?
Fordítási hiba: index cannot null in java.util.Hashtable
Futási hiba: NullPointerException
{null=null, 1=one, 2=two}
{3=three, null=null, 1=one}
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);
} }
B IT MAN117/57
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
B IT MAN117/58
Teszt 7.
Mi lesz a kód kimenete?
Fordítási hiba: error ' ; ' excepted-new ArrayList<Integer>
Fordítási hiba: cannot find symbol class Number
Futási hiba: ClassCastException
[1, 2]
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);
} }
^
B IT MAN117/59
Teszt 8.
Mi lesz a kód kimenete?
[B, C, A, B]
[A, B, B, C]
[A, B, C]
[B, C, A]
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);
}}
B IT MAN117/61
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");
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");
B IT MAN117/63
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ó.
B IT MAN117/64
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
Field Constants:• HOUR• DAY_OF_YEAR• DAY_OF_WEEK• MINUTE• HOUR_OF_DAY• MILLISECOND• SECOND• DAY_OF_WEEK_IN_MONTH
Value Constants:• SUNDAY to SATURDAY• JANUARY to DECEMBER• AM, PM
B IT MAN117/65
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();}
B IT MAN117/66
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();
}
B IT MAN117/67
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;
}
B IT MAN117/68
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);
}}
B IT MAN117/69
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());
cal.roll(GregorianCalendar.HOUR, 4);System.out.println("Date:" + cal.getTime());
}}
B IT MAN117/70
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
B IT MAN117/71
Teszt 12.
Az alábbi metódus kódja helyes?
public Date CalendarToDate (Calendar cal) {return cal.getDate();
}
IGEN
NEM
B IT MAN117/72
Teszt 13.
java.util.Date
java.util.SimpleDateFormat
java.util.DateFormat
java.util.TextFormat
java.text.Format
java.text.SimpleDateFormat
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();
}
B IT MAN117/73
Teszt 14.
java.util.Date
java.util.Calendar
java.util.GregorianCalendar
java.util.Calendar.GregorianCalendar
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();
}
B IT MAN117/74
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);
}}
format.sdf(cal.getTime());
sdf(cal.getTime());
sdf.format(cal.getTime());
format.sdf(cal.getTime()).toString();
B IT MAN117/75
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
1:39:0
3:39:0
73:158:60
Egyéb időpontot
B IT MAN117/76
Teszt 17.
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();
Jelölje meg az aktuális dátum lekérésének összes
helyes módját!
B IT MAN117/78
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.
B IT MAN117/79
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.
B IT MAN117/80
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.
– 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
B IT MAN117/81
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.
B IT MAN117/82
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)
B IT MAN117/83
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);
B IT MAN117/84
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:
– Egy megadott Locale és megadott pattern formázóját
felhasználva: Például:
NumberFormat nf = new DecimalFormat("#,##0.0");
NumberFormat nf = NumberFormat.getNumberInstance(loc); DecimalFormat df = (DecimalFormat)nf; df.applyPattern(pattern);
B IT MAN117/85
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.
B IT MAN117/86
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));
B IT MAN117/87
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.
B IT MAN117/88
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);
B IT MAN117/89
Nemzetköziség
Szöveg formázás
– A megjelenős szövegeket sem célszerű összefűzéssel
előállítani.
– 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.
String s = "A kör kerülete: "+ker+", területe: "+ter;
B IT MAN117/90
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());
B IT MAN117/91
Példakód – Localeimport 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();
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));
}}
B IT MAN117/92
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.
B IT MAN117/93
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.
B IT MAN117/94
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);
B IT MAN117/95
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.
B IT MAN117/96
Nemzetköziség
Erőforrás kezelés
– 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.
B IT MAN117/97
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!
B IT MAN117/98
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"));
}}
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?
B IT MAN117/99
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 2018dbpassword=*\#>^<\#*database=localhostdbuser=BitMan
B IT MAN117/100
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);
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();}}
}
B IT MAN117/101
Teszt 18.
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();
Melyik Locale megadás helyes?
B IT MAN117/102
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"
B IT MAN117/103
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");
B IT MAN117/105
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.
B IT MAN117/106
Logolás
Javaban a java.util.logging csomag biztosítja a logolást,
a Logger osztály használatával.
Logger létrehozása:
– name: a logger neve
– resourceBundleName: nemzetközi erőforrás kezelő neve
• Értéke lehet null
Logger(String name, String resourceBundleName)
B IT MAN117/107
Logolás
Naplózási szint: az események 7 súlyossági kategóriába
sorolhatók:
SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST
Súlyos
Figyelmeztető
Információs
Beállítási
Jó
Jobb
Legjobb
-
+
B IT MAN117/108
Logolás
A naplózási szint beállítása
– LOGGER.setLevel(szint);
– 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.
LOGGER.setLevel(Level.INFO);
B IT MAN117/109
Logolás
Naplózás:
– logger.xxx("Message");
– Az xxx metódus az egyes szintek nevével egyezik meg.
– Csak azok az üzenetek naplózódnak, amelyek legalább a
beállított szinttel rendelkeznek!
logger.setLevel(Level.INFO);
logger.severe("Info Log");logger.warning("Info Log");logger.info("Info Log");logger.finest("Really not important");
B IT MAN117/110
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.
– 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
B IT MAN117/111
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();}
}}
Példakód – Logger
B IT MAN117/113
Logolás
Logger Handler
Formatter
ExternalSystem
FilterFilter
A java.util.logging csomag (részlete)
B IT MAN117/114
Teszt 21.
Melyik csomagban van a Logger osztály?
java.util.logger
java.util.logging
java.util
java.util.logger.logging
B IT MAN117/115
Teszt 22.
logger.info("data");
logger.warning("data");
logger.server("data");
logger.error("data");
logger.log("data");
logger.exception("data");
logger.finest("data");
Hogyan lehet írni egy megnyitott Logger fájlba?
B IT MAN117/116
Teszt 23.
SimpleLogFormatter
SimpleTextFormatter
LogFileFormatter
XMLFormatter
SimpleFormatter
HTMLFormatter
Milyen formázók állnak rendelkezésre a logoláshoz?