a svájci bicska -...

117
B IT M A N 117/1 v: 2018.02.05 B IT M A N 7. Ea: A java.util csomag Java Programozás A svájci bicska

Upload: others

Post on 07-Nov-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

B IT MAN117/1 v: 2018.02.05B IT MAN

7. Ea: A java.util csomag

Java Programozás

A svájci bicska

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/3 B IT MAN

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/52

Teszt 1.

Mekkora egy HashMap alapértelmezett kapacitása (mérete)?

20

16

12

10

1024

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/56

Teszt 5.

Lehet null értéket hozzáadni egy List-hez (listához)?

IGEN

NEM

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/60

Teszt 9.

Az alábbi sor deklaráció helyes?

IGEN

NEM

Queue que = new Queue<String>;

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/62 java.util.Date by Salvador Dali

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/77

Hello!

Hallo!

Heló!

Hola!

Namastḕ!

java.util.Locale – Nemzetköziség

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/104Logolás – java.util.logging

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

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/112

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?

B IT MAN117/117

VÉGEVÉGE