Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Objektorienteeritud programmeerimine
11. loeng
22. aprill
Eno Tõnisson
1
Kasutatud
• H. Heina loengumaterjalid
• J. Kiho Väike Java leksikon
• J. Kiho Java Programmeerimise aabits
• Y. D. Liang Introduction to Java Programming
• Java tutorial. Java kodulehel
2
Eelmisel nädalal
• loeng
– erindid, vood
• praktikum
– erindid
• kevad
3
Umbes mitu tundi tegelesite eelmisel nädalal selle ainega (loeng+praktikum+iseseisvalt)?
1. paariline
4
1. 2. 3. 4. 5. 6. 7. 8.
0% 0% 0% 0%0%0%0%0%
1. 0-2 tundi
2. 2-4 tundi
3. 4-6 tundi
4. 6-8 tundi
5. 8-10 tundi
6. 10-12 tundi
7. 12-14 tundi
8. üle 14 tunni
Kuivõrd olete selle ainega graafikus? 1. paariline
5
1. 2. 3. 4. 5.
0% 0% 0%0%0%
1. Isegi ees
2. Täiesti graafikus
3. Veidi maas, aga saan ise hakkama
4. Kõvasti maas, vajan abi
5. Ei oska öelda
Umbes mitu tundi tegelesite eelmisel nädalal selle ainega (loeng+praktikum+iseseisvalt)?
2. paariline
6
1. 2. 3. 4. 5. 6. 7. 8.
0% 0% 0% 0%0%0%0%0%
1. 0-2 tundi
2. 2-4 tundi
3. 4-6 tundi
4. 6-8 tundi
5. 8-10 tundi
6. 10-12 tundi
7. 12-14 tundi
8. üle 14 tunni
Kuivõrd olete selle ainega graafikus? 2. paariline
7
1. 2. 3. 4. 5.
0% 0% 0%0%0%
1. Isegi ees
2. Täiesti graafikus
3. Veidi maas, aga saan ise hakkama
4. Kõvasti maas, vajan abi
5. Ei oska öelda
Konsultatsioonid
• neljapäeviti 18.00
• Liivi 2-004
8
Täna
• Vood
• Dünaamilised andmestruktuurid
• Tunnikontroll
9
Sisend-väljund
• Sisend-väljund
• Failid
• Vood
10
Sisend/väljund
• ingl. k. input/output
• pakett java.io
• Javas voo abil
– klaviatuurilt, failist, sõnest, Internetist …
– ekraanile, faili …
11
Failid
• java.io.File
• Fail
– kataloog on ka fail
• Pigem faili (kataloogi) nime (ja tee) esitus
• Ei täpsustata, kuidas sinna kirjutatakse või sealt loetakse
12
Voog
• ingl. k. stream
• osa lihtsalt kannab andmeid, osa ka töötleb
• ühendatakse Java I/O süsteemi abil füüsilise seadmega
• ühel pool tootja (allikas), teisel pool tarbija
• voo andmetele juurdepääs järjestikune
13
Jaotus
• Java seisukohalt jagunevad vood: – sisendvoog (input stream) ja väljundvoog (output
stream) • vastavalt rollile "tootja-tarbija" suhtes
– baidivoog (byte stream) ja märgivoog (character stream) • vastavalt andmete tüübile
– puhverdatud (buffered) ja puhverdamata voog • efektiivsuse kaalutlustel puhverdada
– vastavalt voo kandjale • failivoog (file stream)
• massiivivoog (array stream)
• toruvoog (piped stream)
• …
14
Sisend- ja väljundvoog
• Programmi mõttes – sisendvoog (input stream) – väljundvoog (output stream)
• Väljundvoog võib viia infot suvalisele välisseadmele (fail, kõvaketas, konsool, …), mis toetab baidijadade vastuvõtmist.
• Sisendvoo allikaks on tüüpiliselt klaviatuur, fail, baidimassiiv, …
• Sisend- ja väljundvoo muudab efektiivsemaks puhverdamine
15
Baidivoog
• abstraktsed klassid – InputStream – OutputStream
• klassi InputStream alamklasse – FileInputStream
– ByteArrayInputStream
– SequenceInputStream
– …
• klassi OutputStream alamklasse – FileOutputStream
– DataOutputStream
– CipherOutputStream
– FilterOutputStream
• PrintStream
– …
16
17
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BaitideKopeerimine {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("minemine.txt");
out = new FileOutputStream("koopia.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Märgivoog
• abstraktsed klassid – Reader – Writer
• klassi Reader alamklasse – BufferedReader
– InputStreamReader
• FileReader
– …
• klassi Writer alamklasse – FileWriter
– PrintWriter
– BufferedWriter
– …
18
19
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class MärkideKopeerimine {
public static void main(String[] args) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("minemine.txt");
out = new FileWriter("koopia.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Märgivoog ridahaaval
• Võtame ridahaaval – BufferedReader
• readline
– PrintWriter • print
• println
• printf
• "\r\n"
• "\r"
• "\n"
20
21
import java.io.*;
public class RidadeKopeerimine {
public static void main(String[] args) throws IOException {
BufferedReader sisendvoog = null;
PrintWriter väljundvoog = null;
try {
sisendvoog = new BufferedReader(new
FileReader("minemine.txt"));
väljundvoog = new PrintWriter(new
FileWriter("koopia3.txt"));
String l;
while ((l = sisendvoog.readLine()) != null) {
väljundvoog.println(l);
}
} finally {
if (sisendvoog != null) {
sisendvoog.close();
}
if (väljundvoog != null) {
väljundvoog.close();
}
}
}
}
Baidivoog, märgivoog
• “Sillaks” – InputStreamReader
– OutputStreamWriter
22
Puhverdamine
• Puhver – info ajutiseks salvestamiseks mäluosa – ülesandeks on säilitada andmeid enne nende saatmist
sihtkohta (nt. kõvakettale)
• Andmete lugemise ja kirjutamise protseduurid on aeglased – vahel võib ühe infoühiku saatmine olla praktiliselt sama
“hinnaga” kui komplekti
• Klasse – BufferedInputStream
– BufferedOutputStream
– BufferedReader
– BufferedWriter
23
Puhvrist teele
• kui täis
• meetod flush() – uhtuma
• teatud meetoditega – println()
• Klass PrintWriter – realiseerib liidese Flushable
– loomisel saab märkida, kas iseuhtumine (autoflush) toimib
– meetodid println , printf ja format
24
Faili lõppu juurde
25
Sisendmärgivoogu saab realiseerida järgmise klassi alamklassidega
26 1. 2. 3. 4. 5.
0% 0% 0%0%0%
1.InputStream
2.OutputStream
3.Reader
4.Writer
5. muu
Väljundbaidivoogu saab realiseerida järgmise klassi alamklassidega
27 1. 2. 3. 4. 5.
0% 0% 0%0%0%
1.InputStream
2.OutputStream
3.Reader
4.Writer
5. muu
Baidivoo lõputunnuseks on
28 1. 2. 3.
0% 0%0%
1.0
2.-1
3.null
Katse faililõpust kaugemalt lugeda annab erindi
29
1. 2. 3. 4.
0% 0%0%0%
1.BadLocationException
2.BrokenBarrierException
3.EOFException
4. muu
Klass System
30
• System.in – vaikimisi klaviatuurilt
• System.out, System.err – vaikimisi ekraanile
Muudame väljundit
31
OutputStream output = new
FileOutputStream("c:\\temp\\systemout.txt");
PrintStream printOut = new PrintStream(output);
System.setOut(printOut);
Erinevaid võimalusi
• Olid näited failist faili – baithaaval – märkhaaval – ridahaaval
• Veel – klaviatuurilt – baidimassiivi – andmed – objektid
• liides Serializable
– veebist
32
33
import java.io.*;
public class Klaviatuurilt {
public static void main (String[] args){
try {
BufferedReader br = new BufferedReader (new
InputStreamReader (System.in));
System.out.print ("Sisesta tekst: ");
String s = br.readLine();
System.out.println ("Sisestasid: " + s);
} catch (IOException e) {
System.out.println ("Viga: " + e);
}
}
}
Miks erinevat tüüpi andmeid?
• baidid
• Kas ei võiks ainult baithaaval?
– Kas vedaja võiks teada, mis liiki kaupa ta veab?
– Midagi lisaks kasulikku
34
Andmete kirjutamine faili
35
DataOutputStream dos =
new DataOutputStream (new FileOutputStream
("c:/temp/andmed.bin"));
dos.writeInt (25);
dos.writeDouble (5.22);
dos.close();
Andmed (teadaoleva struktuuriga) failist
36
DataInputStream dis = new DataInputStream (new
FileInputStream ("C:/temp/andmed.bin"));
int n = dis.readInt();
double d = dis.readDouble();
dis.close();
System.out.println ("Loeti: " + n + " ja " + d);
Objektid
• Olid võimalused algtüüpide jaoks
– int, double, boolean …
• Objektid?
37
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream ("o.dat"));
oos.writeObject(new int[] { 1, 2, 3, 4, 5 });
oos.close();
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("o.dat"));
int[] a = (int[])(ois.readObject());
ois.close();
Teeme ise klassi
38
public class SKlass {
String s;
int i;
double d;
public SKlass(String s, int i, double d) {
this.s = s;
this.i = i;
this.d = d;
}
public String toString() {
return "s=" + s + "; i=" + i + "; d=" + d;
}
}
Proovime isendi faili saata
39
SKlass sk = new SKlass("A", 1, 1.5);
ObjectOutputStream oos = new ObjectOutputStream(new
FileOutputStream ("o.dat"));
oos.writeObject(sk);
oos.close();
java.io.NotSerializableException:
Liides Serializable
• Java väljundvoogu saab kirjutada vaid neid objekte, mis realiseerivad liidest Serializable. Neid objekte nimetatakse serialiseeritavateks.
• Liides Serializable – ei ole meetodeid ega muutujaid – kasutatakse vaid märkimiseks, et vastavat objekti on võimalik
saata voogu.
• Massiiv on serialiseeritav, kui tema kõik liikmed realiseerivad
liidest Serializable.
• Algtüüpidele vastavad mähisklassid realiseerivad liidest Serializable. 40
Realiseerime liidese
41
public class SKlass implements Serializable {
String s;
int i;
double d;
public SKlass(String s, int i, double d) {
this.s = s;
this.i = i;
this.d = d;
}
public String toString() {
return "s=" + s + "; i=" + i + "; d=" + d;
}
}
Liides Serializable
• Kui klass realiseerib liidest Serializable, siis kõik tema alamklassid on serialiseeritavad.
• Kui klass realiseerib liidest Serializable, kuid sisaldab liikmeid, mis ei realiseeri liidest Serializable, siis isendit ei saa kirjutada väljundvoogu.
• Mitteserialiseeritavate liikmete ignoreerimiseks tuleb kasutada piiritlejat transient. – Milleks? – Kuidas?
42
public class Klass implements Serializable {
private int v1;
private static double v2;
private transient A v3 = new A();
}
Veebist
String aadress = "http://www.ut.ee";
InputStream sisse =
new URL(aadress).openConnection().getInputStream();
OutputStream valja = new FileOutputStream("uus.html");
43
Otsejuurdepääsuga failid
44
• Osuti (ingl. k. pointer) näitab, millises kohas ollakse.
Otsejuurdepääsuga failid
45
import java.io.*;
public class Otsejuurde {
public static void main(String[] args)
throws IOException {
RandomAccessFile raf = new
RandomAccessFile("raf.dat", "rw");
raf.writeDouble(3.1415);
raf.writeInt(25);
raf.writeDouble(2.7182);
raf.seek(0);
System.out.println(raf.readDouble() + " " +
raf.readInt());
raf.seek(8);
System.out.println(raf.readInt());
}
}
3.1415 25 25
Mis ilmub ekraanile?
46 1. 2. 3. 4. 5.
0% 0% 0%0%0%
OutputStream output = new
FileOutputStream("a.txt");
PrintStream printOut = new
PrintStream(output);
System.setOut(printOut);
System.out.println("A");
System.out.println("B");
1.A
2.B
3.A
B
4. mitte midagi
5. muu
Mis ilmub ekraanile?
47 1. 2. 3. 4. 5.
0% 0% 0%0%0%
PrintStream vana = System.out;
OutputStream output = new
FileOutputStream("a.txt");
PrintStream printOut = new
PrintStream(output);
System.setOut(printOut);
System.out.println("A");
System.setOut(vana);
System.out.println("B");
1.A
2.B
3.A
B
4. mitte midagi
5. muu
Andmestruktuur
• Teatud viisil organiseeritud andmete hulk
• Andmetele juurdepääs, andmetega opereerimine
48
Massiiv
• Samatüübilised elemendid kindlas järjekorras int[]
• Massiivi korral on kaks olulist piirangut:
– kui massiiv on juba loodud, siis tema suurust enam muuta ei saa;
– massiiv ise ei toeta elemendi lisamist ja kustutamist.
• Massiiv on staatiline andmestruktuur – mälukasutus on staatiline: mälu eraldatakse vaid korra
(maksimaalne elementide arv on fikseeritud); • eraldatud mälu maht on kindel suurus;
– sisemine struktuur on fikseeritud ja ei muutu töö käigus;
49
Dünaamilised andmestruktuurid
• Muutuva suurusega • Võimaldavad elemente lisada ja eemaldada • Võimaldavad teha päringuid suuruse (elementide arvu), konkreetse
elemendi sisalduvuse kohta
• Põhitüübid: – list (list) – magasin (stack) – järjekord (queue) – kuhi (heap) – puu (tree) – graaf (graph)
• …
50
Ise teha või olemasolevat kasutada?
• Esialgu teeme ise
• Pärast vaatleme olemasolevaid
51
List • list, loend, nimistu(, ahel)
• Listis on andmeelemendid kindlas järjekorras
• Võimalikud tegevused
– elemendi võtmine – elemendi lisamine – elemendi eemaldamine – leida, mitu elementi on listis – teha kindlaks, kas antud element on listis – teha kindlaks, kas list on tühi – …
• Saab realiseerida mitmel viisil – massiivi abil – lihtahela abil
52
Ahela abil
• Enne aga liides ja abstraktne klass, mis sobiksid nii massiivi kui ka ahela abil realiseerimiseks.
53
Liides
54
public interface MyList {
public void add(Object o); //lisamine lõppu public void add(int index, Object o); //lisamine antud kohale public void clear(); //tühjendamine public boolean contains(Object o); //kas sisaldab antud elementi public Object get(int index); //võtmine antud kohalt (element jääb alles) public int indexOf(Object o); //esimene asukoht public boolean isEmpty(); //kas tühi public int lastIndexOf(Object o); // viimane asukoht public boolean remove(Object o); //eemaldamine esimeselt asukohalt public Object remove(int index); //eemaldamine antud kohalt public Object set(int index, Object o); //panek public int size(); //elementide arv }
Abstraktne klass
55
public abstract class MyAbstractList implements MyList {
protected int size;
protected MyAbstractList() { } //vaikekonstruktor
//konstruktor struktuuri täitmisega
protected MyAbstractList(Object[] objects) {
for (int i = 0; i < objects.length; i++){
this.add(objects[i]);
}
}
public void add(Object o) {
add(size, o);
}
public boolean isEmpty() {
return size == 0;
}
Abstraktne klass (järg)
56
public int size() {
return size;
}
public boolean remove(Object o) {
if (indexOf(o) >= 0) {
remove(indexOf(o));
return true;
}
else return false;
}
}
List lihtahelana
• Ahelloend
• ingl. k. Linked list
• Lihtahel koosneb üksteisega seotud tippudest
• Iga tipu juurest on viit järgmisele tipule
57
private class Node {
Object element;
Node next;
public Node(Object o) {
element = o;
}
}
element next
element next
element next
element next: null
… …
first last
Tipu vahelepanek
58
element next
element next
element next
o next
element next: null
… …
first last
Tipu vahelepanek
59
element next
element next
element next
o next
element next: null
… …
first last
Tipu eemaldamine
60
element next
element next
element next
element next
element next: null
… …
first last
eemaldatav tipp
Tipu eemaldamine
61
element next
element next
element next
element next: null
… …
first last
Algus
62
public class MyLinkedList extends MyAbstractList {
private Node first, last;
public MyLinkedList() {}
public MyLinkedList(Object[] objects) {
super(objects);
}
public Object getFirst() {
if (size == 0) return null;
else return first.element;
}
public Object getLast() {
if (size == 0) return null;
else return last.element;
}
Object, mitte Node
Object, mitte Node
Uus tipp algusesse
63
public void addFirst(Object o) {
}
element next
element next
element next: null
…
first last
Uus tipp algusesse
64
public void addFirst(Object o) {
Node newNode = new Node(o);
}
element next
element next
element next
element next: null
…
first last
newNode
Uus tipp algusesse
65
public void addFirst(Object o) {
Node newNode = new Node(o);
newNode.next = first;
}
element next
element next
element next
element next: null
…
first last
newNode
Uus tipp algusesse
66
public void addFirst(Object o) {
Node newNode = new Node(o);
newNode.next = first;
first = newNode;
}
element next
element next
element next
element next: null
…
last first
newNode
Uus tipp algusesse
67
public void addFirst(Object o) {
Node newNode = new Node(o);
newNode.next = first;
first = newNode;
size++;
if (last == null) last = first;
}
element next
element next
element next
element next: null
…
last first
newNode
Uus tipp lõppu
68
public void addLast(Object o) {
if (last == null) {
first = last = new Node(o);
}
else {
last.next = new Node(o);
last = last.next;
}
size++;
}
Uus tipp
69
public void add(int index, Object o) {
if (index == 0) addFirst(o);
else if (index >= size) addLast(o);
else {…
Uus tipp
70
else {
Node current = first;
for (int i = 1; i < index; i++)
current = current.next;
Node temp = current.next;
current.next = new Node(o);
current.next.next = temp;
size++;
}
element next
element next
element next
element next: null
…
last first
add(2, o)
element next
current temp current
Uus tipp
71
public void add(int index, Object o) {
if (index == 0) addFirst(o);
else if (index >= size) addLast(o);
else {
Node current = first;
for (int i = 1; i < index; i++)
current = current.next;
Node temp = current.next;
current.next = new Node(o);
current.next.next = temp;
size++;
}
}
Tunnikontroll
72
Loengu tempo oli 1. paariline
73 1. 2. 3.
0% 0%0%
1. liiga kiire
2. paras
3. liiga aeglane
Materjal tundus 1. paariline
74 1. 2. 3.
0% 0%0%
1. liiga lihtne
2. parajalt jõukohane
3. liiga keeruline
Loengu tempo oli 2. paariline
75 1. 2. 3.
0% 0%0%
1. liiga kiire
2. paras
3. liiga aeglane
Materjal tundus 2. paariline
76 1. 2. 3.
0% 0%0%
1. liiga lihtne
2. parajalt jõukohane
3. liiga keeruline
Suur tänu osalemast! Kohtumiseni!
77