<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JAVA - Kama Kaczmarek</title>
	<atom:link href="https://kamakaczmarek.net/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://kamakaczmarek.net/category/java/</link>
	<description>Strona z materiałami dla uczniów i nauczycieli</description>
	<lastBuildDate>Fri, 10 Apr 2026 07:46:47 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>22. JAVA &#8211; operacje na plikach i katalogach</title>
		<link>https://kamakaczmarek.net/22-java-operacje-na-plikach-i-katalogach/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 14:32:14 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[files]]></category>
		<category><![CDATA[java]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3383</guid>

					<description><![CDATA[<p>Praca z plikami opiera się na strumieniach wejści/wyjścia.Z pomocą klas InputStream i OutputStream możemy odczytywać plik bajt po bajcie.Operacje na plikach mogą zwrócić IOException, musimy przechwycić błąd, a zamknięcie pliku okodować finally.Metody:&#8211; read &#8211; odczyt 1 bajtu, zwraca int, koniec pliku to wartość -1&#8211; write &#8211; zapisuje do pliku po 1 bajcie   Przykład: import [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/22-java-operacje-na-plikach-i-katalogach/">22. JAVA &#8211; operacje na plikach i katalogach</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Praca z plikami opiera się na strumieniach wejści/wyjścia.<br />Z pomocą klas InputStream i OutputStream możemy odczytywać plik bajt po bajcie.<br />Operacje na plikach mogą zwrócić IOException, musimy przechwycić błąd, a zamknięcie pliku okodować finally.<br />Metody:<br />&#8211; read &#8211; odczyt 1 bajtu, zwraca int, koniec pliku to wartość -1<br />&#8211; write &#8211; zapisuje do pliku po 1 bajcie</p>
<p> </p>
<p>Przykład:</p>
<pre>import java.io.*;<br /><br />public class FilesExample{<br />    public static void main(String[] args) throws IOException {<br />        //ZAPIS DO PLIKU BAJTOWO<br />        char[] chars = {'T', 'e', 'k', 's', 't'};<br />        FileOutputStream out = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            out = new FileOutputStream("src/all/part_10_Files/test.txt");//jeżeli plik nie istnieje to zostanie utworzony<br />            for (char c : chars) {<br />                out.write(c); //zapisujemy do pliku<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (out != null) out.close();//zamykamy plik<br />        }<br /><br /><br />        //po skompilowaniu kodu w terminalu pojawił się nasz plik.<br />        //każde uruchomienie programu spowoduje nadpisanie zawartości pliku<br /><br />        //ZAPIS DO PLIKU ZNAKÓW UNICODE, CZYLI NP POLSKICH LITER, bajt po bajcie<br />        String tekst = "ąęćńźżłó";<br />        char[] charsfw = tekst.toCharArray();<br />        FileWriter fw = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            fw = new FileWriter("src/all/part_10_Files/fw.txt");//jeżeli plik nie istnieje to zostanie utworzony<br />            for (char c : charsfw) {<br />                fw.write(c); //zapisujemy do pliku<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (fw != null) fw.close();//zamykamy plik<br />        }<br /><br />        //ZAPIS DO PLIKU WIELU ZNAKÓW NA RAZ, bez zapisu Unicode czyli polskich znaków<br />        String tekst1 = "To jest tekst do zapisu.";<br />        char[] charsbos = tekst1.toCharArray();<br />        BufferedOutputStream bos = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            bos = new BufferedOutputStream(new FileOutputStream("src/all/part_10_Files/bis.txt"));<br />            for (char c : charsbos) {<br />                bos.write(c); //zapisujemy do pliku<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (bos != null) bos.close();//zamykamy plik<br />        }<br /><br />        //ZAPIS DO PLIKU WIELU ZNAKÓW NA RAZ, z zapisem Unicode czyli polskich znaków<br />        String tekst2 = "To jest tekst do zapisu.";<br />        BufferedWriter bw = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            bw = new BufferedWriter(new FileWriter("src/all/part_10_Files/bw.txt"));<br />            for (int i = 0; i&lt;5; i++) {<br />                bw.write("Linijka " + i + ": " + tekst2 + "\n"); //zapisujemy do pliku<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (bw != null) bw.close();//zamykamy plik<br />        }<br /><br />        //W celu zapisu danych innych niż tekstowe należy korzystać z wyspecjalizowanych klas<br />        //buforowanie do pliku binarnego<br />        DataOutputStream dos = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            dos = new DataOutputStream(<br />                    new BufferedOutputStream(<br />                            new FileOutputStream("src/all/part_10_Files/dos.txt")));<br />           dos.writeUTF("Testowy strumień binarny");<br />           dos.writeShort(30000);<br />           dos.writeLong(12345678963214L);<br />           dos.writeFloat(55.36F);<br />           dos.writeDouble(25878.2548d);<br />           dos.writeByte(11);<br />           dos.writeChar('A');<br />           //zapisujemy<br />            dos.flush();<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (dos != null) dos.close();//zamykamy plik<br />        }<br /><br />//-------------------------------------------------------------------------------<br />        //ODCZYT PLIKU BAJT PO BAJCIE<br />        FileInputStream in = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            in = new FileInputStream("src/all/part_10_Files/test.txt");<br />            int i = 0;<br />            while ((i = in.read()) != -1) {//-1 to koniec pliku<br />                System.out.print((char) i); //konwertujemy na char, bo inaczej będą tylko bajty<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (in != null) in.close();//zamykamy plik<br />        }<br />        System.out.println("\n");<br /><br />        //ODCZYT PLIKU Z POLSKIMI ZNAKAMI, bajt po bajcie<br />        FileReader fr = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            fr = new FileReader("src/all/part_10_Files/fw.txt");<br />            int i = 0;<br />            while ((i = fr.read()) != -1) {//-1 to koniec pliku<br />                System.out.print((char) i); //konwertujemy na char, bo inaczej będą tylko bajty<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (fr != null) fr.close();//zamykamy plik<br />        }<br /><br />        //ODCZYT PLIKU wiele znaków, bez zapisu Unicode czyli polskich znaków<br />        BufferedInputStream bis = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            bis = new BufferedInputStream(new FileInputStream("src/all/part_10_Files/bis.txt"));<br />            int i = 0;<br />            while ((i = bis.read()) != -1) {//-1 to koniec pliku<br />                System.out.print((char) i); //konwertujemy na char, bo inaczej będą tylko bajty<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (bis != null) bis.close();//zamykamy plik<br />        }<br />        System.out.println("\n");<br /><br />        //ODCZYT PLIKU wiele znaków, z Unicode czyli polskimi znakami<br />        BufferedReader br = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            br = new BufferedReader(new FileReader("src/all/part_10_Files/bw.txt"));<br />            String str = null;<br />            while ((str = br.readLine()) != null) {<br />                System.out.println(str);<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (br != null) br.close();//zamykamy plik<br />        }<br /><br />        //W celu odczytu danych innych niż tekstowe należy korzystać z wyspecjalizowanych klas<br />        //!!!odczytujemy dane w takiej samej kolejności jak zapisywaliśmy!!!<br />        DataInputStream dis = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            dis = new DataInputStream(<br />                    new BufferedInputStream(<br />                            new FileInputStream("src/all/part_10_Files/dos.txt")));<br /><br />            //odczytujemy po kolei tak jak było zapisane<br />            //dos.writeUTF("Testowy strumień binarny");<br />            String str1 = dis.readUTF();<br />            System.out.println(str1);<br />            //dos.writeShort(30000);<br />            short srt = dis.readShort();<br />            System.out.println(srt);<br />            //dos.writeLong(12345678963214L);<br />            /*long lng = dis.readLong();<br />            System.out.println(lng);*/<br />            //jeżeli chcielibyśmy pominąć odczyt któregoś z typów musimy przeskoczyć określoną ilość bajtów<br />            dis.skipBytes(8);<br />            //dos.writeFloat(55.36F);<br />            float flt = dis.readFloat();<br />            System.out.println(flt);<br />            //dos.writeDouble(25878.2548d);<br />            double dbl = dis.readDouble();<br />            System.out.println(dbl);<br />            //dos.writeByte(11);<br />            byte bt = dis.readByte();<br />            System.out.println(bt);<br />            //dos.writeChar('A');<br />            char ch = dis.readChar();<br />            System.out.println(ch);<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (dis != null) dis.close();//zamykamy plik<br />        }<br />        //---------------------------------------------------------------------<br />        //KOPIOWANIE PLIKU<br />        FileInputStream incp = null;<br />        FileOutputStream outcp = null;<br />        //zabezpieczamy się przed błedem<br />        try {<br />            //uchwyt do pliku<br />            incp = new FileInputStream("src/all/part_10_Files/test.txt");<br />            outcp = new FileOutputStream("src/all/part_10_Files/testcp.txt");<br />            int i = 0;<br />            while ((i = incp.read()) != -1) {//-1 to koniec pliku<br />                outcp.write(i);<br />            }<br />        } catch (IOException e) { //możemy też zapisać Exception<br />            e.printStackTrace();<br />        } finally {<br />            if (incp != null) incp.close();//zamykamy plik<br />            if (outcp != null) outcp.close();//zamykamy plik<br />        }<br /><br /><br />    }<br />}</pre>
<p> </p>
<h2>Klasa File</h2>
<p>za pomocą klasy File możemy operować na plikach i katalogach</p>
<pre>import java.io.File;<br />import java.io.IOException;<br />import java.util.Date;<br /><br /><br />public class FileClass {<br />    public static void main(String[] args) throws IOException {<br />        File file = new File("src/all/part_10_Files/klasafile.txt");<br />        //sprawdzamy czy plik istnieje<br />        if (!file.exists()){<br />            //tworzymy plik<br />            if (file.createNewFile()){<br />                System.out.println("Utworzono nowy plik.");<br />            } else {<br />                System.out.println("Wystąpił nieoczekiwany błąd.");<br />            }<br />        }<br />        System.out.println("Czy plik może być odczytany?: " + file.canRead());<br />        System.out.println("Czy plik może być zapisywany?: " + file.canWrite());<br />        System.out.println("Czy to katalog?: " + file.isDirectory());<br />        System.out.println("Czy to plik?: " + file.isFile());<br />        System.out.println("Jak się nazywa plik?: " + file.getName());<br />        System.out.println("Nadrzędny katalog: " + file.getParent());<br />        System.out.println("Ścieżka dostępu: " + file.getPath());<br />        System.out.println("Ścieżka dostępu absolutna: " + file.getAbsolutePath());<br />        System.out.println("Czy plik jest ukryty?: " + file.isHidden());<br />        System.out.println("Kiedy modyfikowany?: " + new Date(file.lastModified()));<br />        System.out.println("Ilość bajtów?: " + file.length());<br /><br />        //listujemy katalog<br />        File fl = new File("src/all/part_10_Files");<br />        if (fl.exists()){<br />            String[] files = fl.list();<br />            for (String f : files) {<br />                System.out.println(f);<br />            }<br />        } else {<br />            System.out.println("taki folder nie istnieje");<br />        }<br /><br />        //tworzymy katalog<br />        File dir = new File("src/all/part_10_Files/test_dir");<br />        if(!dir.exists()) {<br />            dir.mkdir();<br />            System.out.println("Utworzono katalog");<br />        } else{<br />            System.out.println("Katalog już istnieje");<br />        }<br /><br />    }<br />}</pre>
<p> </p>
<h2>Serializacja</h2>
<p>Serializacja pozwala na zapisanie/odczytanie obiektów</p>
<pre>import java.io.*;<br /><br />class CarObject implements Serializable{<br />    public String manufacturer;<br />    public String name;<br />    public int productionYear;<br />    public int topSpeed;<br />    public transient int id; //to pole nie będzie serializowane<br /><br />    public CarObject(String manufacturer, String name, int productionYear, int topSpeed, int id) {<br />        this.manufacturer = manufacturer;<br />        this.name = name;<br />        this.productionYear = productionYear;<br />        this.topSpeed = topSpeed;<br />        this.id = id;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "CarObject{" +<br />                "manufacturer='" + manufacturer + '\'' +<br />                ", name='" + name + '\'' +<br />                ", productionYear=" + productionYear +<br />                ", topSpeed=" + topSpeed +<br />                ", id=" + id +<br />                '}';<br />    }<br />}<br /><br />public class SerializeExample {<br />    public static void main(String[] args) throws IOException {<br />        CarObject car1 = new CarObject("Ford", "Mustang", 1970,200,1);<br />        CarObject car2 = new CarObject("Dodge", "Charger", 1975,220,2);<br /><br />        //zapisujemy obiekt do pliku<br />        ObjectOutputStream out = new ObjectOutputStream(<br />                new BufferedOutputStream(<br />                        new FileOutputStream("src/all/part_10_Files/serialize.dat")<br />                ));<br />        out.writeObject(car1);<br />        out.writeObject(car2);<br />        out.flush(); //opróżniamy bufor<br />        out.close();<br /><br />        //odczytujemy obiekt<br />        ObjectInputStream in = new ObjectInputStream(<br />                new BufferedInputStream(<br />                        new FileInputStream("src/all/part_10_Files/serialize.dat")<br />                ));<br />        try {<br />            while (true){<br />                CarObject car = (CarObject) in.readObject();<br />                System.out.println(car);<br />            }<br />        } catch (EOFException e){<br />            //koniec pliku<br />        } catch (Exception e){<br />            e.printStackTrace();<br />        } finally {<br />            if (in!=null) in.close();<br />        }<br />    }<br />}</pre>
<p>Artykuł <a href="https://kamakaczmarek.net/22-java-operacje-na-plikach-i-katalogach/">22. JAVA &#8211; operacje na plikach i katalogach</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>21. JAVA &#8211; wątki</title>
		<link>https://kamakaczmarek.net/21-java-watki/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 14:07:11 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[wątki]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3375</guid>

					<description><![CDATA[<p>Programowanie wielowątkowe/współbieżne pozwala na realizację zadań programu w tym samym czasie/równolegle.Wielowątkowość pozwala na zwiększenie wydajności, program nie będzie już realizowany linijka po linijce, wydzielone bloki programu będą działały niezależnie od siebie i w tym samym czasie. thread &#8211; wątek Wątek ma kilka etapów &#8222;życia&#8221;:NEW &#8211; został utworzony, jeszcze nie działa, przed wywołaniem metody startRUNNABLE &#8211; [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/21-java-watki/">21. JAVA &#8211; wątki</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Programowanie <strong>wielowątkowe</strong>/współbieżne pozwala na realizację zadań programu w tym samym czasie/równolegle.<br />Wielowątkowość pozwala na zwiększenie wydajności, program nie będzie już realizowany linijka po linijce, wydzielone bloki programu będą działały niezależnie od siebie i w tym samym czasie.</p>
<h2><br /><strong>thread</strong> <strong>&#8211; wątek</strong></h2>
<p>Wątek ma kilka etapów &#8222;życia&#8221;:<br />NEW &#8211; został utworzony, jeszcze nie działa, przed wywołaniem metody start<br />RUNNABLE &#8211; w gotowości do działania lub działający<br />BLOCKED &#8211; oczekujący na odblokowanie zasobów<br />WAITING &#8211; oczekujący aż inny wątek się zakończy, zwykle powiązane jest to z metodą join()<br />TIMED_WAITING &#8211; uśpiony, związany z metodą sleep()<br />TERMINATED &#8211; zakończył pracę<br />etap wątku możemy sprawdzić metodą <em><strong>getState()</strong></em></p>
<p> </p>
<p>Przykład: stwórzmy najprostszy wątek odliczający</p>
<pre>//tworzymy nową klasę<br />class NewThread extends Thread{<br />    //każdy z wątków będzie usypiany na inny czas, oczywiście czasem zarządza Java, my jedynie możemy jej przekazać że bardzo nam zależy żeby było jak napisaliśmy<br />    public int sleepTime;<br /><br />    //tworzymy konstruktor, by móc nazywać wątki<br />    public NewThread(String name, int sleepTime) {<br />        super(name);<br />        this.sleepTime = sleepTime;<br />    }<br /><br />    public void run(){<br />        for (int i=1; i&lt;=10; i++){<br />            System.out.println(this.getName() + " i: " + i);<br />            //chcemy uśpić wątek na sekundę<br />            try {<br />                this.sleep(this.sleepTime);<br />            } catch (InterruptedException e){<br />                e.printStackTrace();<br />            }<br />        }<br />    }<br />}<br /><br />public class ThreadsExample {<br />    public static void main(String[] args) {<br />        NewThread t1 = new NewThread("Wątek1", 1000); //wątek NEW<br />        System.out.println(t1.getState());//możemy sprawdzić stan wątku<br />        t1.start();//aby uruchomić wątek należy go wystarować<br />        System.out.println(t1.getState());<br />        NewThread t2 = new NewThread("Wątek2", 800);<br />        t2.start();<br />    }<br />}</pre>
<p> </p>
<h2>Race condition</h2>
<p>Podczas pracy z wątkami należy uważać na sytuację, kiedy kilka wątków pracuje na tym samym zasobie.<br />Wyobraźmy sobie, że te wątki pobierają aktualną wartość i ją modyfikują, który wątek będzie pierwszy? czy wartość, którą pobrał wątek została już zmodyfikowana przez inny wątek? czy może jeszcze nie?<br />Taka sytuacja, gdzie kilka wątków jednocześnie odczytuje i modyfikuje identyczne dane nazywa się wyścigiem &#8211; race condition.<br /><br />Taki problem możemy rozwiązać dzięki słówku synchronized, który umieszczamy przy tworzeniu metody. Zapewnia ono, że kilka współistniejących wątków nie wykona w tym samym czasie tego samego kodu. Uniemożliwia wielu wątkom współdzielenie zasobu.<br /><br />Aby zrozumieć problem wyścigu przeanalizujmy poniższy kod, gdzie mamy do czynienia z 2 wątkami, które jednocześnie wywołują metodę increment, która zwiększa o 1 wartość zmiennej counter.</p>
<pre>class ThreadCounter implements Runnable{<br />    ThreadsRaceCondition app;<br /><br />    public ThreadCounter(ThreadsRaceCondition app) {<br />        this.app = app;<br />    }<br /><br />    @Override<br />    public void run() {<br />        for (int a = 0; a &lt; 100000; a++){<br />            app.increment();<br />        }<br />    }<br />}<br />public class ThreadsRaceCondition {<br />    public int counter = 0;<br />    public /*synchronized*/ void increment(){ //dodanie słówka synchronized eliminuje problem wyścigu<br />        this.counter++;<br />    }<br />    public int getCounter(){<br />        return counter;<br />    }<br /><br />    public static void main(String[] args) throws InterruptedException{<br />        ThreadsRaceCondition t = new ThreadsRaceCondition();<br />        Thread th1 = new Thread(new ThreadCounter(t));<br />        Thread th2 = new Thread(new ThreadCounter(t));<br />        th1.start();<br />        th2.start();<br />        th1.join(); //main poczeka na oba wątki, join() pozwala nakazać wątkowi, aby poczekał aż poprzedni wątek zakończy działanie<br />        th2.join();<br />        System.out.println(t.getCounter());<br /><br />        //różne wyniki przed użyciem słówka synchronized: 188983 137796 120909<br />        //po dodaniu synchronized zawsze otrzymamy poprawny wynik 200000<br />        /* jeżeli chcemy synchronizować określony blok kodu używamy zapisu:<br />        public void increment(){<br />            synchronized(this){//i to co jest w {} zostanie zsynchronizowane<br />                this.counter++;<br />            }<br />        }<br />        Używając powyższego rozwiązania korzystamy z tzw monitora, czyli obiektu, który zostaje odblokowany lub zablokowany. I w powyższym przykładzei określamy go jako this, chyba że korzystamy z innego obiektu np. listy to przekazujemy w nawiasie nie this, a właśnie ArrayList<br />        Nie należy nadużywać synchronized, ponieważ powoduje to spowolnienie działania programu<br />         */<br /><br />    }<br />}</pre>
<p><br />Wątki działają równolegle i każdy ma iterację w pętli for po 100000 razy, czyli po zakończeniu pracy wynik powinien wynosić 200000, ale tak się nie dzieje. Co więcej, za każdym razem otrzymujemy inny wynik.<br />W każdej iteracji pętli wątki pobierają wartość counter i zwiększają ją o 1, jeżeli np. w aktualnym momencie wartość zmiennej wynosi 4, pobierają ją oba wątki, zwiększają o 1 i zapisują, to wartość counter zamiast wynosić 6, będzie wynosiła 5 &#8211; co jest błędem.<br /><br />Podobny problem może nastąpić jeżeli rdzeń procesora przydzieli danemu wątkowi więcej czasu na wykonanie operacji lub wątek zostanie wywłaszczony(uśpiony).<br />Np.<br />w1 i w2 startują, więc pobierają wartość counter 0;<br />w1 zostaje uśpiony na jakiś czas;<br />w2 w tym czasie zwiększa wartość counter w 4 iteracjach i zapisuje 4<br />w1 się wybudza, ale w pamięci ma 0, które zwiększa o 1 i do zmiennej counter zapisuje 1<br />i tak właśnie tracone są dane.<br />Wątki należy synchronizować.</p>
<p> </p>
<h2>Oczekiwanie na dane</h2>
<p>Często zachodzi potrzeba, aby zaczekać na dane, które są przetwarzane w innym wątki.<br />W takim przypadku używamy wait i notify.<br /><br />Napiszmy apkę dla oczekiwania na dostarczenie pizzy.</p>
<pre>import java.util.LinkedList;<br /><br />class House{<br />    public LinkedList&lt;String&gt; delivery = new LinkedList&lt;&gt;();<br /><br />    public void waitForDelivery(){<br />        //tworzymy blok synchronized ponieważ na tym obiekcie mogą jednocześnie pracować 2 wątki<br />        synchronized (delivery) {<br />            //pętla sprawdzi czy delivery nie jest pusta. Jeżeli kolekcja jest pusta to będziemy czekali na powiadomienie o zmianie tego stanu<br />            System.out.println("Oczekiwanie na dostawę");<br />            while(delivery.isEmpty()){//pętla zabezpiecza wątek przed nieplanowanym wybudzeniem<br />                try{<br />                    delivery.wait();<br />                } catch (InterruptedException e){<br />                    e.printStackTrace();<br />                }<br />            }<br />            System.out.println("Pizza odebrana: " + delivery.poll());<br />        }<br />    }<br /><br />    public void pizzaGuy(){<br />        synchronized (delivery){<br />            System.out.println("Pizza dostarczona");<br />            delivery.add("Pepperoni");<br />            //teraz musimy powiadomić wątek, który czekał<br />            delivery.notify();//to wybudzi wątek, który czekał<br />        }<br />    }<br />}<br /><br />public class ThreadsWaitNotify {<br />    public static void main(String[] args) throws InterruptedException{<br />        //tworzymy obiekt i wątki<br />        House house = new House();<br />        Thread customer = new Thread(new Runnable() {//wątek klienta<br />            @Override<br />            public void run() {<br />                house.waitForDelivery();<br />            }<br />        });<br />        customer.start();//ten wątek będzie czekał, aż w delivery coś się zmieni<br />        Thread.sleep(3000);//symulujemy, że coś się z pizzą dzieje<br /><br />        //kolejny wątek<br />        Thread producer = new Thread(new Runnable() {<br />            @Override<br />            public void run() {<br />                house.pizzaGuy(); //w tym wątku mamy dodanie elementu do delivery, a następnie wywołanie metody notify(), co spowoduje wybudzenie 1 wątku i wyświetlenie informacji, że pizza została dostarczona i element zostanie zdjęty z listy przez pool<br />            }<br />        });<br />        producer.start();<br />        customer.join();<br />    }<br />}</pre>
<p> </p>
<h2>Interfejs Runnable</h2>
<p>Zamiast korzystać z klasy Thread możemy skorzystać z interfejsu Runnable.<br />Pozwala to na rozszerzanie wielu klas.</p>
<p>Przykład:</p>
<pre>class RunnableC implements Runnable{<br />    private int sleepTime;<br />    private String threadName;<br /> <br />    public RunnableC(int sleepTime, String threadName) {<br />        this.sleepTime = sleepTime;<br />        this.threadName = threadName;<br />    }<br /><br />    @Override<br />    public void run() {<br />        for (int i=1; i&lt;=10; i++){<br />            System.out.println(threadName + ", wartość: " + i);<br />            //chcemy uśpić wątek na sekundę<br />            try {<br />                Thread.sleep(sleepTime); //Thread.sleep usypia tylko aktualnie wykonywany wątek<br />            } catch (InterruptedException e){<br />                e.printStackTrace();<br />            }<br />        }<br />    }<br />}<br />//jeżeli chcemy się pozbyć Thread możemy stworzyć nową klasę<br />class RunnableC2 extends RunnableC implements Runnable{<br />    private Thread thread;<br /><br />    public RunnableC2(int sleepTime, String threadName) {<br />        super(sleepTime, threadName);<br />    }<br /><br />    public void start(){<br />        if (thread == null){<br />            thread = new Thread(this);<br />            thread.start();<br />        }<br />    }<br />}<br /><br />public class RunnableExample {<br />    public static void main(String[] args) {<br />        RunnableC t1 = new RunnableC(500, "Wątek 1 ");<br />        Thread th1 = new Thread(t1, "Wątek 1 ");<br />        th1.start();<br /><br />        RunnableC t2 = new RunnableC(1000, "Wątek 2 ");<br />        Thread th2 = new Thread(t2, "Wątek 2 ");<br />        th2.start();<br /><br />        RunnableC2 t3 = new RunnableC2(300, "Wątek 3 ");<br />        t3.start();<br />    }<br />}</pre>
<h2> </h2>
<h2>Wątek na bazie klasy anonimowej</h2>
<pre>public class AnonimusRunnableExample {<br />    public static void main(String[] args) throws InterruptedException {/*nie będziemy robili przechwytywania ewentualnego błędu, zapiszemy że może taki wystąpić */<br /><br />            Thread thread = new Thread(new Runnable() {//jak zaczniemy pisać new Ru... intellij podpowie {}<br />                @Override<br />                public void run() {<br />                    for (int i = 0; i &lt; 5; i++) {<br />                        System.out.println("i = " + i);<br />                    }<br />                }<br />            });<br />            thread.start();<br /><br />            //sprawdzimy czy wątek jest zakończony<br />            Thread.sleep(200);<br />            System.out.println(thread.getState());<br />    }<br />}</pre>
<h2>Wątki i Lambda</h2>
<pre>public class LambdaThread {<br />    public static void main(String[] args) {<br />        Thread thread = new Thread( () -&gt; {<br />            for (int i=0; i&lt;5; i++){<br />                System.out.println("i = " + i);<br />                try {<br />                    Thread.sleep(1000);<br />                } catch (InterruptedException e){<br />                    e.printStackTrace();<br />                }<br />            }<br />        });<br />        thread.start();<br />    }<br />}</pre>
<h2>Wątek demoniczny</h2>
<p>Wątki demoniczne to najczęściej wątki, które monitorują stan aplikacji (jednym z takich wątków jest GarbageCollector),<br />nie wpływają bezpośrednio na działanie apki i mogą być &#8222;odgórnie&#8221; zakończone przez JVM, gdy kończy ona pracę z wątkami klienckimi np main.<br />Należy pamiętać , aby umieszczać w tych wątkach takie zadania, które mogą zostać gwałtownie przerwane.</p>
<p>Przykład:</p>
<pre>public class ThreadsDemon {<br />    public static void main(String[] args) throws InterruptedException{<br />        //tworzymy nowy wątek<br />        Thread th = new Thread(new Runnable() {<br />            @Override<br />            public void run() {<br />                //tworzymy nieskończoną pętlę, bo i tak zostanie ona zamknięta gdy main się zakończy<br />                int i = 0; //tworzymy zmienną by podejrzeć działanie wątku w tle<br />                while(true) {<br />                    try{<br />                        Thread.sleep(1000);<br />                        System.out.println("Wątek demoniczny: " + i);<br />                        i++;<br />                    }catch(InterruptedException e){<br />                        e.printStackTrace();<br />                    }<br />                }<br />            }<br />        });<br />        //najpierw określamy czy wątek jest demoniczny, później starujemy<br />        th.setDaemon(true);<br />        th.start();<br />        //zapauzujmy nasz główny wątek kliencki<br />        Thread.sleep(5000);//w tym czasie będzie działał nasz wątek demoniczny, a po 5 sekundach zakończy się działanie wątków<br />        System.out.println("Zakończenie działania programu.");<br />    }<br />}</pre>
<p> </p>
<p>Zadanie: Napisz program &#8211; Zegar</p>
<pre>import javax.swing.*;<br />import java.awt.*;<br />import java.time.LocalDateTime;<br />import java.time.chrono.ChronoLocalDateTime;<br /><br />//skorzystamy z klasy JFrame i Runnable<br />public class Clock extends JFrame implements Runnable{<br /><br />    //dodajemy prywatną zmienną, która będzie przechowywała aktualny wątek<br />    private Thread thread;<br /><br />    //deklarujemy zmienne określające h, m i s<br />    String hour, min, sec;<br />    //teraz label, w którym przechowamy informację<br />    JLabel label;<br /><br />    //tworzymy pusty konstruktor z wątkiem<br />    public Clock() {<br />        label = new JLabel("", JLabel.CENTER); //dodajemy nowy label<br />        label.setBounds(5,5,100,40); //ustawiamy położenie o wielkość labela<br />        add(label); //dodajemy nasz label do JFrame<br />        setSize(100,80); //wymiery okna<br />        setLayout(null);//mamy bounds więc ustawiamy null, nie określamy layoutu<br />        setVisible(true); //pokazujemy okienko<br />        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //co się stanie po kliknięciu X<br /><br />        thread =  new Thread(this);<br />        thread.start();<br />    }<br /><br />    @Override<br />    public void run() {<br />        try{<br />            //tworzymy nieskończoną pętlę, bo czas będzie liczony bez końca<br />            while (true){<br />                //pobieramy aktualny czas<br />                LocalDateTime today = LocalDateTime.now();<br />                hour = "" + today.getHour();<br />                //sformatujemy wyświetlanie minut do 2 cyfr<br />                min = String.format("%02d",today.getMinute()); //przekazujemy 2 znaki i liczby całkowite stąd %2d, a jeżeli będzie pobrana pojedyncza liczba to dodajemy 0 stąd %02d<br />                sec = String.format("%02d",today.getSecond()); //przekazujemy 2 znaki i liczby całkowite stąd %2d, a jeżeli będzie pobrana pojedyncza liczba to dodajemy 0 stąd %02d<br /><br />                //dodajemy informację do Labela<br />                label.setText(hour + ":" + min + ":" + sec);<br />                //przed zakończeniem pętli while uśpimy wątek na 1s<br />                thread.sleep(1000);<br />            }<br />        }catch (Exception e){<br />            e.printStackTrace();<br />        }<br />    }<br /><br />    public static void main(String[] args) {<br />        //tworzymy nową instancję zegara<br />        Clock clock = new Clock();<br />    }<br />}</pre>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/21-java-watki/">21. JAVA &#8211; wątki</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>20. JAVA &#8211; klasa Optional</title>
		<link>https://kamakaczmarek.net/20-java-klasa-optional/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 14:03:53 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[klasa]]></category>
		<category><![CDATA[optional]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3372</guid>

					<description><![CDATA[<p>Klasa Optional wprowadzona od Javy 8 umożliwia nam sprawdzenie, czy występuje null, bez pisania nadmiarowego kodu i uniknięcie częstego błędu NullPointerException.Jest to generyczny pakiet, który umożliwia opakowanie zmiennej o wartości null. Przykład: import java.util.Optional;public class OptionalExample { public static void main(String[] args) { //tworzymy Optional, który nie może być null za pomocą metody of() Optional&#60;String&#62; [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/20-java-klasa-optional/">20. JAVA &#8211; klasa Optional</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Klasa Optional wprowadzona od Javy 8 umożliwia nam sprawdzenie, czy występuje null, bez pisania nadmiarowego kodu i uniknięcie częstego błędu NullPointerException.<br />Jest to generyczny pakiet, który umożliwia opakowanie zmiennej o wartości null.</p>
<p>Przykład:</p>
<pre>import java.util.Optional;<br /><br /><br />public class OptionalExample {<br />    public static void main(String[] args) {<br />        //tworzymy Optional, który nie może być null za pomocą metody of()<br />        Optional&lt;String&gt; optional1 = Optional.of("Optional.of()");<br />        System.out.println(optional1.get());<br /><br />        //jezeli stworzymy optional z null:<br />        //Optional&lt;String&gt; optional2 = Optional.of(null);//otrzymujemy błąd NullPointerException<br /><br />        //metoda nullable - może posiadać wartość lub bycnull<br />        Optional&lt;String&gt; optional3 = Optional.ofNullable("Optional.ofNullable(\"Nie null\")");<br />        System.out.println(optional3);<br />        Optional&lt;String&gt; optional4 = Optional.ofNullable(null);<br />        System.out.println("tu mamy null i zwróci: " + optional4 + ", nie ma błędu.");<br /><br />        //metoda empty tworząca pusty Optional<br />        Optional&lt;String&gt; optional5 = Optional.empty();<br />        System.out.println("pusty Optional zwróci: " + optional5 + ", nie ma błędu.");<br /><br />        //tworzymy Optionala i wykorzystamy jego metody<br />        //tworzymy zmienną, która może mieć wartość lub null - nie wiemy co przechowuje<br />        String str = String.valueOf(0);<br />        //str=null; //spowosuje wyświetlenie komunikatu zmienna str jest null<br />        Optional&lt;String&gt; optStr = Optional.ofNullable(str);<br />        //pokaż kotku co masz w środku<br />        if (optStr.isPresent()){<br />            System.out.println(optStr.get());<br />        } else {<br />            System.out.println("zmienna str jest null");<br />        }<br /><br />        //jeżeli wewnątrz Optionala jest wartość możemy wywołać lambdę<br />        optStr.ifPresent( i -&gt; System.out.println(i));<br />        //referencja do metody<br />        optStr.ifPresent(System.out::println);<br /><br />        //metoda map() pozwala na przekazanie funkcji jeżeli w obiekcie jest wartość, zwrócona wartość może być null<br />        Integer integer = Integer.valueOf(0);<br />        Optional&lt;Integer&gt; optInt = Optional.ofNullable(integer);<br />        Optional&lt;Integer&gt; res = optInt.map(i -&gt; i+1);<br />        System.out.println(res);<br />        System.out.println(res.get());<br /><br />        Integer integer1 = Integer.valueOf(0);<br />        Optional&lt;Integer&gt; optInt1 = Optional.ofNullable(integer1);<br />        optInt.map(i -&gt; i+1)<br />                .map(i -&gt; i * 100)<br />                .map(i -&gt; i / 2)<br />                .ifPresent(System.out::println);<br /><br />        Integer integer2 = null;<br />        Optional&lt;Integer&gt; optIntNull = Optional.ofNullable(integer2);<br />        Optional&lt;Integer&gt; resNull = optIntNull.map(i -&gt; i+1);<br />        System.out.println(resNull); //to nam zwróci Optional.empty<br />        //System.out.println(resNull.get()); //ten zapis wygeneruje błąd: NoSuchElementException<br /><br />        //jeżeli chcemy zwrócić domyślną wartość jeżeli nasz Optional jest null, to korzystamy z orElse<br />        System.out.println(resNull.orElse(666)); //ta wartość nie zostanie wyświetlona jeżeli optional nie będzie null<br /><br />        //filtrowanie Optional poprzez wyrażenie lambda, jeżeli warunek zostanie spełniony to optional przekazywany jest dalej, jeżeli nie to otrzymamy pusty obiekt<br />        String str1 = "Nie pusty string";<br />        Optional&lt;String&gt; optS = Optional.ofNullable(str1);<br />        String test = optS.filter(s -&gt; s.length() &gt;0).orElse("Domyśny tekst");<br />        System.out.println(test);<br /><br />        Optional&lt;String&gt; optS2 = Optional.ofNullable(null);<br />        optS2.map(s -&gt; s + "blablabla")<br />                .filter(s -&gt; s.length() &gt;0)//jeżeli otional spełnia warunek to jest przekazywany dalej<br />                .or( () -&gt; Optional.ofNullable("Nowy domyślny tekst"))//metoda or podstawia domyślną wartość jeżeli pojawi się pusty Optional<br />                .ifPresent(System.out::println);<br /><br />        //metoda or i referencje<br />        String st = "Uwielbiam programować"; //zamień tekst na null<br />        Optional&lt;String&gt; os = Optional.ofNullable(st);<br />        String text = os.filter(s-&gt;s.length()&gt;10)<br />                .or( () -&gt; Optional.ofNullable("mamy null"))<br />                .map(String::toUpperCase)<br />                .map(String::trim)<br />                .orElse("i jestem tu");<br />        System.out.println(text);<br />    }<br />}</pre>
<p> </p>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/20-java-klasa-optional/">20. JAVA &#8211; klasa Optional</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>19. JAVA &#8211; strumieniowanie</title>
		<link>https://kamakaczmarek.net/19-java-strumieniowanie/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 13:52:21 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[stream]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3366</guid>

					<description><![CDATA[<p>Strumieniowanie pozwala na iterowanie i manipulowanie elementami list i kolekcji z użyciem wyrażenia lambda. Stream jest interfejsem generycznym,  doskonałą alternatywą dla przeglądania list przy pomocy pętli i przede wszystkim jest szybsza. Pozwala też na równoległe wykonywanie operacji na danych. Przykład: plik Products.java public class Products { public String name; public int price; public Products(String name, [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/19-java-strumieniowanie/">19. JAVA &#8211; strumieniowanie</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Strumieniowanie pozwala na iterowanie i manipulowanie elementami list i kolekcji z użyciem wyrażenia lambda.</p>
<p><br /><strong>Stream</strong> jest interfejsem generycznym,  doskonałą alternatywą dla przeglądania list przy pomocy pętli i przede wszystkim jest szybsza. Pozwala też na równoległe wykonywanie operacji na danych.</p>
<p>Przykład:</p>
<p><strong>plik Products.java</strong></p>
<pre>public class Products {<br />    public String name;<br />    public int price;<br /><br />    public Products(String name, int price) {<br />        this.name = name;<br />        this.price = price;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    public int getPrice() {<br />        return price;<br />    }<br /><br />    public void setPrice(int price) {<br />        this.price = price;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Products{" +<br />                "name='" + name + '\'' +<br />                ", price=" + price +<br />                '}';<br />    }<br />}</pre>
<p><strong>plik Car.java</strong></p>
<pre>import java.util.Comparator;<br />import java.util.Objects;<br /><br />// w klasie musimy użyć Comparatoor do porównywania elementów, aby skutecznie stosować collect<br />public class Car implements Comparator&lt;Car&gt; {<br />    public String name;<br />    public int topSpeed;<br />    public int price;<br /><br />    public Car(String name, int topSpeed, int price) {<br />        this.name = name;<br />        this.topSpeed = topSpeed;<br />        this.price = price;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Car{" +<br />                "name='" + name + '\'' +<br />                ", topSpeed=" + topSpeed +<br />                ", price=" + price +<br />                '}';<br />    }<br /><br />    //dodajemy equals and hashcode<br />    //wybieramy z listy tylko name<br />    @Override<br />    public boolean equals(Object o) {<br />        if (this == o) return true;<br />        if (o == null || getClass() != o.getClass()) return false;<br />        Car car = (Car) o;<br />        return name.equals(car.name);<br />    }<br /><br />    @Override<br />    public int hashCode() {<br />        return Objects.hash(name);<br />    }<br /><br />    //implementujemy metodę compare<br />    //modyfikujemy zwracanie<br />    @Override<br />    public int compare(Car o1, Car o2) {<br />        return o1.name.compareTo(o2.name);<br />    }<br />}</pre>
<p> </p>
<p><strong>plik StreamExample.java</strong></p>
<pre>import java.util.*;<br />import java.util.stream.Collectors;<br />import java.util.stream.Stream;<br /><br />public class StreamExample {<br />    public static void main(String[] args) {<br />        //tworzymy zbiór, który następnie przefiltrujemy<br />        ArrayList&lt;String&gt; arl = new ArrayList&lt;&gt;();<br />        arl.add("PHP");<br />        arl.add("Python");<br />        arl.add("C++");<br />        arl.add("Java");<br />        arl.add("JS");<br />        arl.add("HTML");<br />        arl.add("CSS");<br /><br /><br />        //aby iterować po elementach użyjemy strumieniowania zamiast pętli<br />        //chcemy otrzymać listę elementów, których liczba znaków =3<br />        arl.stream().filter(someValue -&gt; someValue.length()&gt;=3 &amp;&amp; someValue.length()&lt;=6)//nie dajemy średnika, bo po kropce damy kolejne metody<br />                    //możemy dodatkowo przefiltrować ze względu na literę od jakiej sie zaczybnna nazwa<br />                    .filter(someValue -&gt; someValue.startsWith("P") || someValue.startsWith("C"))<br />                    //iterujemy po elementach po przefiltrowaniu<br />                    .forEach(someValue -&gt; System.out.println(someValue));<br /><br />        //tworzymy listę na bazie klasy<br />        ArrayList&lt;StreamMyClass&gt; animals = new ArrayList&lt;&gt;();<br />        animals.add( new StreamMyClass("Elephant", 4000, 2));<br />        animals.add( new StreamMyClass("Python", 150, 5));<br />        animals.add( new StreamMyClass("ShiTzu", 7, 0));<br />        animals.add( new StreamMyClass("Wasp", 0, 7));<br />        animals.add( new StreamMyClass("Wife", 75, 10));<br /><br />        //filtrujemy elementy własnej klasy po poziomie agresji<br />        animals.stream().filter(myName -&gt; myName.agrresive&gt;6)<br />                        .filter(myName -&gt;  myName.weight&gt;50 &amp;&amp; myName.weight&lt;100)<br />                        .forEach(myValue -&gt; System.out.println(myValue));<br /><br />        //otrzymane wyniki możemy dodać do innej kolekcji<br />        //służy do tego metoda collect()<br /><br />        //tworzymy listę z wyników filtrowania<br />        List&lt;StreamMyClass&gt; list = animals.stream().filter(sth -&gt; sth.agrresive&gt;6)<br />                .collect(Collectors.toList());<br /><br />        //teraz chcemy z wyników zrobić ArrayList<br />        ArrayList&lt;StreamMyClass&gt; arrl = new ArrayList&lt;&gt;(list);<br />        arrl.forEach(sth -&gt; System.out.println(sth));<br /><br />        //aby dodać do kolekcji tylko unikalne elementy użuwamy Set()<br />        //przykład1<br />        List&lt;Integer&gt; arr = Arrays.asList(8,-2,6,7,5,4,2,8,3,3,7,10,-11,2);<br />        Set&lt;Integer&gt; uniqueNumbers = arr.stream().collect(Collectors.toSet());<br />        System.out.println(uniqueNumbers);<br /><br />        //przykład2<br />        ArrayList&lt;String&gt; arl1 = new ArrayList&lt;&gt;();<br />        arl1.add("PHP");<br />        arl1.add("PHP");<br />        arl1.add("Python");<br />        arl1.add("C++");<br />        arl1.add("C++");<br />        arl1.add("Java");<br />        arl1.add("JS");<br />        arl1.add("JS");<br />        arl1.add("HTML");<br />        arl1.add("CSS");<br />        Set&lt;String&gt; set = arl1.stream().filter(someValue -&gt; someValue.length()&gt;=3 &amp;&amp; someValue.length()&lt;=6)<br />                .filter(someValue -&gt; someValue.startsWith("P") || someValue.startsWith("C"))<br />                .collect(Collectors.toSet());<br />        set.forEach(someValue-&gt; System.out.println(someValue));<br /><br />        //przykład z użyciem klasy Car<br />        ArrayList&lt;Car&gt; cars = new ArrayList&lt;&gt;();<br />        //dodajmy elementy, które będą zduplikowane<br />        cars.add(new Car("Peugeot", 270, 150000));<br />        cars.add(new Car("Ford", 250, 170000));<br />        cars.add(new Car("Peugeot", 270, 150000));<br />        cars.add(new Car("Mercedes", 240,200000));<br />        cars.add(new Car("Mercedes", 240,200000));<br />        cars.add(new Car("MBW", 280,260000));<br />        cars.add(new Car("Opel", 220, 140000));<br />        //użyjemy teraz collect() do wyciągnięcia unikalnych danych<br />        Set&lt;Car&gt; set1 = cars.stream().filter(car -&gt; car.price&lt;260000)<br />                .collect(Collectors.toSet());<br />        set1.forEach(car -&gt; System.out.println(car));<br /><br />        //sumowanie elementów za pomoca summingToInt na bazie klasy Products<br />        ArrayList&lt;Products&gt; product = new ArrayList&lt;Products&gt;();<br />        //dodajmy elementy<br />        product.add(new Products("apple", 3));<br />        product.add(new Products("banana", 4));<br />        product.add(new Products("pineaple", 4));<br />        product.add(new Products("bag", 1));<br />        product.add(new Products("perfume", 12));<br />        int totalPrice = product.stream()<br />                .collect(Collectors.summingInt(element -&gt; element.price));<br />        System.out.println(totalPrice);<br /><br />        //sumowanie elementów można teżprzeprowadzić za pomocą reduce()<br />        //skorzystamy z istniejącej listy arr<br />        int resultSum = arr.stream()<br />                //reduce(wartość starowa, (lambda z 2 argumentami: suma dotychczasowa i następny element)<br />                .reduce(0, (tempsum, el) -&gt; tempsum+el);<br />        System.out.println("wynik sumowania reduce() " + resultSum);<br /><br />        //sumowanie z referencją do metody<br />        int resultSumRef = arr.stream()<br />                .reduce(0, Integer::sum);<br />        System.out.println("Wynik sumowania redice() z referencją: " + resultSumRef);<br /><br />        //zmapujmy teraz naszą listę po name<br />        Map&lt;String, Products&gt; producsMap = product.stream()<br />                .collect(Collectors.toMap(el-&gt;el.name, el-&gt;el));<br />        System.out.println(producsMap);<br />        //odwołajmy sie do konkretnego elementu mapy<br />        Products pr = producsMap.get("apple");<br />        System.out.println(pr);<br /><br />        //referencja do metody<br />        List&lt;Integer&gt; producsPrices = product.stream()<br />                .filter(el-&gt;el.price&lt;10)<br />                .map(Products::getPrice).collect(Collectors.toList());<br />        System.out.println(producsPrices);<br /><br />        //kolekcję możemy przeszukać pod kątem największem i najmniejszej wartości<br />        //max()<br />        Products prodMaxPrices = product.stream().max((pr1, pr2) -&gt; pr1.price&gt;pr2.price ? 1 : -1)<br />                .get();<br />        System.out.println(prodMaxPrices);<br />        //min()<br />        Products prodMinPrices = product.stream().min((pr1, pr2) -&gt; pr1.price&gt;pr2.price ? 1 : -1)<br />                .get();<br />        System.out.println(prodMinPrices);<br /><br />        //ograniczmy listę zwracanych wyników, wykorzystamy istniejącą litę arr<br />        List&lt;Integer&gt; result = arr.stream()<br />                .filter(el-&gt; el &gt; 0 &amp;&amp; el &lt;10)<br />                .limit(6)<br />                .collect(Collectors.toList());<br />        System.out.println(result);<br /><br />        //aby zliczyc ilość elementów używamy count()<br />        System.out.println(result.stream().count());<br /><br />        //jeżeli potrzebujemy stworzyć stream wypełniony wartościami, możemy zrobić to dwojako<br />        //z użyciem limit<br />        System.out.println("Stream z limitowaniem");<br />        Stream.iterate(0, i -&gt; i+1).limit(10)<br />                .forEach(stream -&gt; System.out.print(stream));<br />        //bez limit<br />        System.out.println("\nStream bez limitowania");<br />        Stream.iterate(0, i -&gt; i&lt;10, i -&gt; i+1)<br />                .forEach(stream -&gt; System.out.print(stream));<br /><br />    }<br />}</pre>
<p><strong>plik StreamMyClass.java</strong></p>
<pre>//filtrowanie własnej klasy<br />//stwórzmy klasę dla klasyfikacji zwierząt pod kątem wagi i agresji<br />public class StreamMyClass {<br />    public String name;<br />    public int weight;<br />    public int agrresive; //1-10<br /><br />    public StreamMyClass(String name, int weight, int agrresive) {<br />        this.name = name;<br />        this.weight = weight;<br />        this.agrresive = agrresive;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "StreamMyClass{" +<br />                "name='" + name + '\'' +<br />                ", weight=" + weight +<br />                ", agrresive=" + agrresive +<br />                '}';<br />    }<br />}</pre>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/19-java-strumieniowanie/">19. JAVA &#8211; strumieniowanie</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>18. JAVA &#8211; wyrażenia Lambda</title>
		<link>https://kamakaczmarek.net/18-java-wyrazenia-lambda/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 13:38:23 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lambda]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3358</guid>

					<description><![CDATA[<p>Wyrażenia lambda inaczej zwane domknięciami, to fragmenty kodu, które przekazujemy argumentem. Mogą zostać przypisane do zmiennej i przekazywane np. w pracy z listami. Wyrażenia lambda wykorzystujemy z interfejsami funkcyjnymi posiadającymi jedną abstrakcyjną metodę. Interfejs funkcyjny może posiadać tylko jedną metodę abstrakcyjną, ale może posiadać wiele metod default i static. Metody default nie muszą być implementowane [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/18-java-wyrazenia-lambda/">18. JAVA &#8211; wyrażenia Lambda</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>Wyrażenia lambda</strong> inaczej zwane domknięciami, to fragmenty kodu, które przekazujemy argumentem. Mogą zostać przypisane do zmiennej i przekazywane np. w pracy z listami.</p>
<p>Wyrażenia lambda wykorzystujemy z interfejsami funkcyjnymi posiadającymi jedną abstrakcyjną metodę.</p>
<p>Interfejs funkcyjny może posiadać tylko jedną metodę abstrakcyjną, ale może posiadać wiele metod default i static. Metody default nie muszą być implementowane przez klasy korzystające z interfejsu (przydaje się to gdy już istniejący interfejs należy rozszerzyć).<br />Jeżeli w kodzie natrafimy na znak &#8222;-&gt;&#8221; oznacza on właśnie wykorzystanie lambdy.</p>
<p> </p>
<p>Przykład:</p>
<pre>import java.util.ArrayList;<br />import java.util.Arrays;<br />import java.util.function.Predicate;<br /><br />//tworzymy interfejs funkcyjny do mnożenia 2 intów<br />interface Multiplication{<br />    int multi(int x, int y);<br />}<br /><br />//interfejs z metodą generyczną dzielenia<br />interface Division&lt;T&gt;{<br />    T div(T x, T y);<br />}<br /><br />//krok4 - dodamy ogólny szablon dla działań matematycznych z typem generycznym<br />//będzie zracany wynik jakiegoś typu z metody, która będzie posiadała 2 parametry<br />//dzięki temu nie musimy definiować wielu interfejsów jw.<br />interface Operations&lt;T&gt;{<br />    T operate(T x, T y);<br />}<br /><br />public class Lambda {<br /><br />    //krok3 - przekazujemy wyrażenie lambda jako argument metody<br />    public void lambda(Multiplication multi){<br />        System.out.println("Wynik z metody pobierającej lambdę " + multi.multi(10,10));<br />    }<br /><br />    public static void main(String[] args) {<br />        //krok1 - wykorzystujemy wyrażenie lambda<br />        Multiplication multi = (int x, int y) -&gt; x * y;<br />        System.out.println("Mnożenie wynosi " + multi.multi(2,3));<br /><br />        //krok2 - wykorzystujemy interfejs generyczny<br />        Division&lt;Float&gt; div = (Float x, Float y) -&gt; {//użyjemy nawiasów klamrowych dla bloku kodu<br />            float d = x/y;<br />            return d;<br />        };//dajemy średnik, bo to koniec linijki kodu!<br />        float d = div.div(10f,2f);<br />        System.out.println("Dzielenie wynosi " + d);<br /><br />        //cd krok3 - wykorzystamy metodę<br />        Lambda lambdaExampleWithMethod = new Lambda();<br />        lambdaExampleWithMethod.lambda(multi);<br />        lambdaExampleWithMethod.lambda( (x,y) -&gt; (x+2) * y );//modyfikujemy dane, nie podaję typów, bo Java sama się domyśli<br /><br />        //krok4 - wykorzystujemy szablon ogólny Operations<br />        Operations&lt;/*typ w zależności od potrzeb*/Integer&gt; add = /*podpinamy teraz wyrażenie lambda*/ (x,y)-&gt;x+y;<br />        System.out.println("Metoda lambda z dodawaniem " + add.operate(5,6));<br /><br />        Operations&lt;Integer&gt; multipl = (x,y)-&gt;x*y;<br />        System.out.println("Metoda lambda z mnożeniem " + add.operate(5,6));<br /><br />        //wykorzystajmy wyrażenie lambda do sortowania elementów w tablicy ze względu na długość<br />        String[] arr = {"Python", "Java", "PHP", "C++", "HTML+CSS"};<br />        //korzystamy z metody sort dla Arrays<br />        Arrays.sort(arr, /*tworzymy wyrażenie lambda*/(x,y)-&gt;{return x.length() - y.length();});<br />        for (String a : arr) {<br />            System.out.println(a);<br />        }<br /><br />        //wyrażenie lambda może korzystać z wbudowanych interfejsów funkcyjnych z pakietu java.util.functions<br />        //np. Predicate, żeby usunąć element z listy<br /><br />        //tworzymy nową listę<br />        ArrayList&lt;String&gt; al = new ArrayList&lt;&gt;();<br />        al.add("PHP");<br />        al.add("Python");<br />        al.add(null);<br />        al.add("Java");<br />        al.add("C++");<br />        al.add("Pascal");<br />        al.add(null);<br /><br />        //skorzystamy z metody removeIf<br />        //dodajmy na górze import pakietu functions<br />        //usuń element jeżeli x jest równe null lub jest równe "Pascal"<br />        al.removeIf( x -&gt; x == null || x.equalsIgnoreCase("Pascal"));<br />        System.out.println(al); //otrzymujemy oczyszczoną listę<br /><br /><br />    }<br />}</pre>
<p> </p>
<p>Przykład: Wyrażenie lambda i default</p>
<pre><br />@FunctionalInterface<br />interface Operators{<br />    int operate(int x, int y);<br /><br />    default int add(int x, int y){<br />        System.out.println("Metoda add z interfejsu");<br />        return x+y;<br />    }<br />    default int subtract(int x, int y){<br />        System.out.println("Metoda subtract z intefejsu");<br />        return x-y;<br />    }<br />    default int multi(int x, int y){<br />        System.out.println("Metoda multi z intefejsu");<br />        return x*y;<br />    }<br />    static int divide(int x, int y){<br />        System.out.println("Metoda divide z intefejsu");<br />        return x/y;<br />    }<br />}<br /><br />//tworzymy klasę implementującą nasz interfejs<br />class OperatorsClass implements Operators{<br /><br />    //przesłaniamy metody abstrakcyjne<br /><br />    @Override<br />    public int multi(int x, int y) {<br />        System.out.println("OperatorsClass.multi()");<br />        return x*y;<br />    }<br /><br />    @Override<br />    public int operate(int x, int y) {<br />        System.out.println("OperatorsClass.operate()");<br />        return x+y;<br />    }<br /><br />    //możemy wykorzystać domyślną implementację metody wewnątrz interfejsu<br /><br />    @Override<br />    public int add(int x, int y) {<br />        //wywołamy metodę domyślną interfejsu<br />        System.out.println("OperatorsClass.add()");<br />        return Operators.super.add(x,y);<br />    }<br />}<br /><br />public class LambdaAndDefaultMethods {<br />    public static void main(String[] args) {<br />        Operators math = (int x, int y) -&gt; x * y;<br />        System.out.println(math.operate(5,2));<br /><br />        System.out.println(Operators.divide(55,11));<br /><br />        System.out.println(math.multi(5,2));<br /><br />        OperatorsClass operatorsClass = new OperatorsClass();<br />        System.out.println(operatorsClass.operate(12,2));<br />        System.out.println(operatorsClass.multi(2,2));<br />        System.out.println(operatorsClass.subtract(20,10));<br />        System.out.println(operatorsClass.add(20,10));<br />    }<br />}</pre>
<p> </p>
<h2>Referencja do metody</h2>
<p>Z wyrażeniem lambda związane jest pojęcie referencji do metody.<br />Oznacza to, że możemy się odwołać do metody bez jej wywołania, potrzebuje jednak interfejsu funkcyjnego, gdyż referencja do metody tworzy instancję tegoż interfejsu.</p>
<p><br />Konstrukcja to: nazwaklasy::nazwametody.<br /><br />Wykorzystamy referencję lambda do wyświetlenia hashu danego obiektu:</p>
<pre>import java.util.function.IntSupplier;<br /><br />public class LambdaReferenceToMethods {<br /><br />    //stworzymy własną metodę wykorzystującą ntSupplier<br />    public void myFunction(IntSupplier intSupplier){<br />        System.out.println(intSupplier.getAsInt());<br />    }<br /><br />    public static void main(String[] args) {<br />        Object obj = new Object();<br />        //wywołujemy interfejs funkcyjny zwracający int bezargumentowo - IntSupploer<br />        //jeżeli po obj damy kropkę zobaczymy listę dostępnych metod, ale my chcemy dostać się do metody poprzez referencję czyli wykorzystamy ::<br />        IntSupplier intSupplier = obj::hashCode;<br /><br />        //wywołujemy metodę interfejsu funkcyjnego<br />        System.out.println(intSupplier.getAsInt());<br /><br />        //tworzymy nową instancję z wykorzystaniem własnej metody<br />        //otrzymamy ten sam wynik jw<br />        LambdaReferenceToMethods lr = new LambdaReferenceToMethods();<br />        lr.myFunction(intSupplier);<br /><br />    }<br />}</pre>
<p> </p>
<h2>Lambda i Timer</h2>
<p>Przykład wykorzystania lambdy wraz z klasą Timer do wyświetlania w okienku (klasa JFrame) aktualnego czasu co 1s.</p>
<pre>import javax.swing.*;<br />import java.util.Date;<br /><br />public class LambdaAndTimer extends JFrame {<br />    public static void main(String[] args) {<br />        //tworzymy okienko<br />        LambdaAndTimer lat = new LambdaAndTimer();<br />        lat.setTitle("Timer");//ustawiamy tytuł<br />        lat.setSize(300,100);//ustawiamy rozmiar okna<br />        lat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ustalamy co się stanie po naciśnięciu przycisku zamknięcia<br /><br />        //miejsce gdzie będzie wyświetlany tekst w pojedynczej linijce<br />        JLabel lbl = new JLabel();<br />        lat.add(lbl);//dodajemy label do timera<br /><br />        //wyświetlamy<br />        lat.setVisible(true);<br /><br />        //tworzymy timer - ustawiamy czas na 1s(1000ms) i przekazujemy lambdę<br />        Timer timer = new Timer(1000, event -&gt;{//aktualizujemy co 1s lbl i terminal<br />            Date date = new Date(); //pobieramy aktualną datę<br />            System.out.println(date.toString()); //wyświetlamy w terminalu<br />            lbl.setText(date.toString()); //wyświetlamy w label<br />        });<br />        //startujemy odliczanie<br />        timer.start();<br /><br /><br />    }<br />}</pre>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/18-java-wyrazenia-lambda/">18. JAVA &#8211; wyrażenia Lambda</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>17. JAVA &#8211; typy generyczne</title>
		<link>https://kamakaczmarek.net/17-java-typy-generyczne/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 12:53:59 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[java]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3351</guid>

					<description><![CDATA[<p>Typy generyczne w Java to nic innego jak szablony, które możemy wykorzystać dla różnych typów danych.Metody zdefiniowane w klasie generycznej mogą zostać wykorzystane dla typów złożonych np. Integer, String, Float itd., bez konieczności pisania oddzielnych klas. Na potrzeby tego przykładu wszystkie klasy umieścimy w tym samym pliku: plik GenericsExample.java //stwórzmy klasę generyczną dla jednego typu, [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/17-java-typy-generyczne/">17. JAVA &#8211; typy generyczne</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Typy generyczne</strong> w Java to nic innego jak szablony, które możemy wykorzystać dla różnych typów danych.<br />Metody zdefiniowane w klasie generycznej mogą zostać wykorzystane dla typów złożonych np. Integer, String, Float itd., bez konieczności pisania oddzielnych klas.<br /><br />Na potrzeby tego przykładu wszystkie klasy umieścimy w tym samym pliku:</p>



<p class="wp-block-paragraph"><strong>plik GenericsExample.java</strong></p>



<pre class="wp-block-preformatted">//stwórzmy klasę generyczną dla jednego typu, która będzie zawierała 2 pola oraz konstruktor, gettery i settery oraz toString<br /><br />class Test&lt;T&gt;{//w nawiasie ostrym podajemy drukowanymi literami np. T(jak typ), K(klucz, V(wartość), E(element np. kolekcji), N(liczba) - dowolnie, później te litery przyjmą typ np. Integer, String...<br />    private T a;<br />    private T b;<br /><br />    public Test(T a, T b) {<br />        this.a = a;<br />        this.b = b;<br />    }<br /><br />    public T getA() {<br />        return a;<br />    }<br /><br />    public void setA(T a) {<br />        this.a = a;<br />    }<br /><br />    public T getB() {<br />        return b;<br />    }<br /><br />    public void setB(T b) {<br />        this.b = b;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Test{" +<br />                "a=" + a +<br />                ", b=" + b +<br />                '}';<br />    }<br />}<br /><br /><br />//stwórzmy teraz klasę generyczną dla wielu typów, która będzie zawierała 2 pola oraz konstruktor, gettery i settery oraz toString<br />class MultiTest&lt;T, U, V&gt;{//w nawiasie ostrym podajemy drukowanymi literami np. T, U, V - dowolnie, później te litery przyjmą typ np. Integer, String...<br />    private T x;<br />    private U y;<br />    private V z;<br /><br />    public MultiTest(T x, U y, V z) {<br />        this.x = x;<br />        this.y = y;<br />        this.z = z;<br />    }<br /><br />    public T getX() {<br />        return x;<br />    }<br /><br />    public void setX(T x) {<br />        this.x = x;<br />    }<br /><br />    public U getY() {<br />        return y;<br />    }<br /><br />    public void setY(U y) {<br />        this.y = y;<br />    }<br /><br />    public V getZ() {<br />        return z;<br />    }<br /><br />    public void setZ(V z) {<br />        this.z = z;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "MultiTest{" +<br />                "x=" + x +<br />                ", y=" + y +<br />                ", z=" + z +<br />                '}';<br />    }<br />}<br /><br /><br />public class GenericsExample {<br />    public static void main(String[] args) {<br />        //przykład dla Integer<br />        Test&lt;Integer&gt; gnrInt = new Test&lt;Integer&gt;(1,2); //przyjmujemy typ Integer<br />        System.out.println(gnrInt.toString());<br /><br />        //przykład dla String<br />        Test&lt;String&gt; gnrStr = new Test&lt;String&gt;("a","b"); //przyjmujemy typ String<br />        System.out.println(gnrInt.toString());<br /><br />        //wywołamy teraz klasę generyczną dla wielu typów<br />        MultiTest&lt;Integer, Float, String&gt; multiTest = new MultiTest&lt;&gt;(1,2.5f, "String");<br />        System.out.println(multiTest.toString());<br />    }<br />}</pre>



<h2>Metody generyczne</h2>
<p>Metody generyczne mogą się znajdować w dowolnej klasie, nie koniecznie generycznej.</p>
<p>Stwórzmy zwykłą klasę, która zawierać będzie metodę generyczną:</p>
<pre>import java.util.ArrayList;<br /><br />class SimpleClass{//zwykła klasa<br />    //metoda generyczna, która zwróci nam ostatni element ArrayList<br />    public static &lt;E&gt; E getLastElement(ArrayList&lt;E&gt; arl) {//przekazujemy ArrayList w argumencie<br />        return arl.get(arl.size() - 1);//pobieramy ostatni element listy<br />    }<br />}<br /><br />public class GenericMethod {<br />    public static void main(String[] args) {<br />        //tworzymy ArrayList na bazie Integer<br />        ArrayList&lt;Integer&gt; arl = new ArrayList&lt;&gt;();<br />        arl.add(5);<br />        arl.add(15);<br />        System.out.println(SimpleClass.getLastElement(arl));//wywołujemy metodę z klasy<br />    }<br />}</pre>
<p> </p>
<h2>Ograniczenia</h2>
<p>Podczas pisania kodu możemy mieć potrzebę ograniczenia tego, co będzie podstawione pod typ generyczny np.  typ zmiennej lub klasa, która ma dziedziczyć tylko po konkretnej klasie:</p>
<p><strong>plik GenericsExtends</strong></p>
<pre>import java.util.ArrayList;<br />import java.util.Iterator;<br /><br />//tworzymy klasę bazową<br />class Person{<br />    private String name;<br /><br />    //dodajemy konstruktor, gettery i settery oraz toString<br /><br />    public Person(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Person{" +<br />                "name='" + name + '\'' +<br />                '}';<br />    }<br />}<br /><br />//tworzymy klasę Employee, która rozszerzy klasę person<br />class Employee extends Person{<br />    private String jobTitle;<br /><br />    //dodajemy konstruktor, gettery i settery oraz toString<br />    public Employee(String name, String jobTitle) {<br />        super(name);<br />        this.jobTitle = jobTitle;<br />    }<br /><br />    public String getJobTitle() {<br />        return jobTitle;<br />    }<br /><br />    public void setJobTitle(String jobTitle) {<br />        this.jobTitle = jobTitle;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Employee{" +<br />                //ponieważ klasa rozszerza klasę Person, to mamy dostęp do pola name, które wyświetlimy<br />                "name=" + this.getName() + '\'' +<br />                "jobTitle='" + jobTitle + '\'' +<br />                '}';<br />    }<br />}<br /><br />//tworzymy kolejną klasę<br />class Contractor extends Employee{<br />    public Contractor(String name, String jobTitle) {<br />        super(name, jobTitle);<br />    }<br />    @Override<br />    public String toString() {<br />        return "Contractor{" + super.toString() + "}";//łączymy toString z toString z Employee<br />    }<br />}<br /><br />//poniższa klasa nie będzie dziedziczyła po Person, więc jej zastosowanie wygeneruje błąd<br />class Bug {<br />    private String name;<br /><br />    //dodajemy konstruktor, gettery i settery oraz toString<br /><br />    public Bug(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Bug{" +<br />                "name='" + name + '\'' +<br />                '}';<br />    }<br />}<br /><br />//tworzymy klasę generyczną Organisation, która będzie posiadała ograniczenia<br />//zależy nam na tym, aby klasa Organisation mogła przyjmować jedynie klasy rozszerzające Person, żadne inne<br /><br />class Organisation&lt;T extends Person&gt;{<br />    private ArrayList&lt;T&gt; participants;<br /><br />    //tworzymy konstruktor, który stworzy zbiór konkretnego typu<br />    public Organisation() {<br />        participants = new ArrayList&lt;T&gt;();<br />    }<br /><br />    //metoda dodająca uczestnika<br />    public void addParticipants(T p){<br />        participants.add(p);<br />    }<br /><br />    //metoda pobierająca index<br />    public T getParticipants(int index){<br />        return participants.get(index);<br />    }<br /><br />    //wyświetlenie uczestników<br />    public void printParticipants(){<br />        Iterator&lt;T&gt; iter = participants.iterator();<br />        while (iter.hasNext()){<br />            System.out.println(iter.next());<br />        }<br />    }<br />}<br /><br />public class GenericsExtends {<br />    public static void main(String[] args) {<br />        //tworzymy nowy obiekt na bazie Organisation, który przyjmie typ Employee<br />        Organisation&lt;Employee&gt; org = new Organisation&lt;&gt;();<br />        org.addParticipants(new Employee("Jan","programmer"));<br />        org.addParticipants(new Employee("Iza","programmer"));<br />        org.addParticipants(new Contractor("Alek", "programmer"));<br /><br />        org.printParticipants();<br /><br />        //Organisation&lt;Bug&gt; test = new Organisation&lt;Bug&gt;(); //ta klasa nie rozszerza Person<br />    }<br />}</pre>
<p><strong>i kolejny przykład GenericExtends1.java</strong></p>
<pre><br />import java.util.ArrayList;<br />import java.util.Iterator;<br /><br />class Country{<br />    private String name;<br /><br />    public Country(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Country{" +<br />                "name='" + name + '\'' +<br />                '}';<br />    }<br />}<br /><br />class Continent extends Country{<br />    private String continentName;<br /><br />    public Continent(String name, String continentName) {<br />        super(name);<br />        this.continentName = continentName;<br />    }<br /><br />    public String getContinentName() {<br />        return continentName;<br />    }<br /><br />    public void setContinentName(String continentName) {<br />        this.continentName = continentName;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Continent{" +<br />                "country='" + super.getName() + '\'' +<br />                ", continentName='" + continentName + '\'' +<br />                '}';<br />    }<br />}<br /><br />class World&lt;T extends Country&gt;{<br />    private ArrayList&lt;T&gt; parts;<br /><br />    //tworzymy konstruktor, który stworzy zbiór konkretnego typu<br />    public World() {<br />        parts = new ArrayList&lt;T&gt;();<br />    }<br /><br />    //metoda dodająca<br />    public void addParts(T p){<br />        parts.add(p);<br />    }<br /><br />    //metoda pobierająca index<br />    public T getParts(int index){<br />        return parts.get(index);<br />    }<br /><br />    //wyświetlenie uczestników<br />    public void printParts(){<br />        Iterator&lt;T&gt; iter = parts.iterator();<br />        while (iter.hasNext()){<br />            System.out.println(iter.next());<br />        }<br />    }<br />}<br /><br />public class GenericExtends1 {<br />    public static void main(String[] args) {<br />        World&lt;Continent&gt; continent = new World&lt;&gt;();<br />        continent.addParts(new Continent("Poland", "Europe"));<br />        continent.addParts(new Continent("USA", "America N"));<br />        continent.addParts(new Continent("Germany", "Europe"));<br /><br />        continent.printParts();;<br /><br />    }<br />}</pre>
<p> </p>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/17-java-typy-generyczne/">17. JAVA &#8211; typy generyczne</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>16. JAVA &#8211; kolekcje</title>
		<link>https://kamakaczmarek.net/16-java-kolekcje/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Tue, 12 Oct 2021 17:38:39 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[kolekcje]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3328</guid>

					<description><![CDATA[<p>Kolekcje są alternatywą dla tablic, nie mają ograniczeń wielkości. Zamiast tworzyć tablicę, możemy użyć klasy ArrayList, z gotowymi metodami manipulującymi danymi. Gdy korzystamy z metod ArrayList, musimy pamiętać, że należy rzutować typy, dlatego korzystając z kolekcji możemy od razu określić jaki typ danych będzie przechowywany. Do obsługi danych w kolekcjach, możemy zastosować klasę Collections, która [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/16-java-kolekcje/">16. JAVA &#8211; kolekcje</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Kolekcje są alternatywą dla tablic, nie mają ograniczeń wielkości.</p>
<p>Zamiast tworzyć tablicę, możemy użyć klasy ArrayList, z gotowymi metodami manipulującymi danymi.</p>
<p>Gdy korzystamy z metod ArrayList, musimy pamiętać, że należy rzutować typy, dlatego korzystając z kolekcji możemy od razu określić jaki typ danych będzie przechowywany.</p>
<p>Do obsługi danych w kolekcjach, możemy zastosować klasę Collections, która pozwala np. na sortowanie elementów</p>
<h2> </h2>
<h2>ArrayList</h2>
<p>ArrayList jest tablicą, która może zostać zastąpiona inną, można jej używać do losowego pobierania danych i dodawania lub usuwania elementów.</p>
<p>Przykład:</p>
<pre>import java.util.ArrayList;<br />import java.util.Collections;<br /><br />public class ArrayList_Basics {<br />    public static void main(String[] args) {<br />        //tworzymy nowy obiekt ArrayList bez deklaracji typu<br />        ArrayList simpleList = new ArrayList();<br />        //dodajemy element do listy<br />        simpleList.add(new String("pierwszy tekst"));<br />        simpleList.add(new String("drugi tekst"));<br /><br />        //pobieramy element listy, odwołujemy się do niego tak jak w tablicy, czyli po indeksie licząc od 0<br />        String element = (String)simpleList.get(0);//musimy dokonać rzutowania, bo przy deklaracji kolekcji nie określiliśmy typu<br />        System.out.println(element); //otrzymamy:pierwszy tekst<br /><br />        //teraz skorzystamy z listy z deklaracją typu<br />        ArrayList&lt;String&gt; typedList = new ArrayList&lt;&gt;();//drugi raz nie musimy wpisywać typu<br />        //dodamy teraz nowe elementy, teraz będziemy mogli wybrać z listy String<br />        typedList.add("string 1");<br />        typedList.add("string 2");<br />        typedList.add("string 3");<br /><br />        //pobieramy elementy<br />        String el = typedList.get(1);//nie musimy rzutować<br />        System.out.println(el);<br /><br />        //przeglądamy kolekcję<br />        System.out.println("Lista:");<br />        for (String s: typedList){<br />            System.out.println(s);<br />        }<br /><br />        //usuwamy elementy<br />        typedList.remove(2);<br />        System.out.println("Lista po usunięciu 3 elementu:");<br />        for (String s: typedList){<br />            System.out.println(s);<br />        }<br /><br />        //dodamy element pod konkretny indeks - pozostałe się przesuną<br />        typedList.add(0,"string 0");<br />        System.out.println("Dodany element pod indeks 0:");<br />        for (String s: typedList){<br />            System.out.println(s);<br />        }<br /><br />        //podmieniamy element listy<br />        typedList.set(2,"podmieniony element");<br />        System.out.println("Podmieniony element pod indeks 2:");<br />        for (String s: typedList){<br />            System.out.println(s);<br />        }<br /><br />        //aby posortować elementy skorzystamy z klasy Collecttions<br />        System.out.println("Sortujemy:");<br />        Collections.sort(typedList);<br />        for (String s: typedList){<br />            System.out.println(s);<br />        }<br /><br /><br />    }<br />}</pre>
<p> </p>
<h2>Metody ArrayList</h2>
<p>Przetestujmy teraz możliwe metody ArrayList.</p>
<p><strong>plik Person.java</strong></p>
<pre>//dodajemy nową prostą klasę operacyjną<br />public class Person {<br />    private String name; //ustawiamy prywatną zmienną<br /><br />    //dodajemy konstruktor oraz gettery, settery i toString<br />    public Person(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Person{" +<br />                "name='" + name + '\'' +<br />                '}';<br />    }<br />}</pre>
<p> </p>
<p><strong>plik ArrayListMethods.java</strong></p>
<pre>import java.util.ArrayList;<br /><br />public class ArrayListMethods {<br />    public static void main(String[] args) {<br />        //tworzymy nowe obiekty<br />        Person prs1 = new Person("Adam");<br />        Person prs2 = new Person("Anna");<br />        Person prs3 = new Person("Piotr");<br />        Person prs4 = new Person("Damian");<br />        Person prs5 = new Person("Jagoda");<br /><br />        //dodajemy ArrayList z typem Person<br />        ArrayList&lt;Person&gt; al1 = new ArrayList&lt;&gt;();<br />        //dodajemy do listy obiekty utworzone wyżej<br />        al1.add(prs1);<br />        al1.add(prs2);<br />        al1.add(prs3);<br />        al1.add(prs4);<br />        al1.add(prs5);<br /><br />        for (Person p : al1) {<br />            System.out.println(p);<br />        }<br /><br />        //tworzymy nowe obiekty, które następnie będziemy dodawać do nowej listy<br />        //następnie nową listę dołączymy do istniejącej<br />        Person prs6 = new Person("Andrzej");<br />        Person prs7 = new Person("Julia");<br /><br />        //tworzymy nową kolekcję<br />        ArrayList&lt;Person&gt; al2 = new ArrayList&lt;&gt;();<br />        //dołączamy nowe obiekty do listy al2<br />        al2.add(prs6);<br />        al2.add(prs7);<br /><br />        //-------------------------------------------------<br />        //dołączamy drugą kolekcję do pierwszej kolekcji<br />        al1.addAll(al2);<br />        System.out.println("Uzupełniona kolekcja o nową kolekcję");<br />        for (Person p : al1) {<br />            System.out.println(p);<br />        }<br /><br />        //--------------------------------------------------<br />        //czy dany element istnieje w kolekcji<br />        if (al1.contains(prs6)){<br />            System.out.println("al1 zawiera prs6");<br />        }<br /><br />        //--------------------------------------------------<br />        //czy kolekcja zawiera wszystkie elementy innej kolekcji<br />        if (al1.containsAll(al2)){<br />            System.out.println("al1 zawiera elementy al2");<br />        }<br />        //jeżeli teraz dodalibyśmy do al2 nowy element to powyższy warunek zwróciłby false<br /><br />        //--------------------------------------------------<br />        //usuwanie wszystkich elementów z jednej kolekcji, należących do innej kolekcji<br />        al1.removeAll(al2);<br />        if (al1.containsAll(al2)){<br />            System.out.println("al1 zawiera elementy al2");<br />        } else {<br />            System.out.println("al1 nie zawiera elementów al2");<br />        }<br /><br />        //--------------------------------------------------<br />        //tworzenie tablicy z listy<br />        Person[] people = new Person[al1.size()];<br />        people = al1.toArray(people);<br />        System.out.println("Tablica stworzona z listy ma " + people.length + " elementów.");<br /><br />        //--------------------------------------------------<br />        //czyszczenie kolekcji<br />        al1.clear();<br />        if (al1.isEmpty()){<br />            System.out.println("Kolekcja jest pusta");<br />        }<br />    }<br />}</pre>
<p> </p>
<h2>Iterator</h2>
<p><strong>Iterator</strong> &#8211; alternatywa dla foreach. Do przeglądania kolekcji należy używać iteratora, pozwala on na uniknięcie błędów off-by-one oraz na jednolity sposób dostępu do struktur danych.</p>
<p>Przykład:</p>
<p><strong>plik Animals.java</strong></p>
<pre>public class Animals {<br />    //stworzymy kilka prywatnych pól<br />    private String name, ocurrance;<br />    int size; //1-mały, 2-średni, 3-duży, 4-olbrzymi<br /><br />    //dodajemy konstruktor<br />    public Animals(String name, String ocurrance, int size) {<br />        this.name = name;<br />        this.ocurrance = ocurrance;<br />        this.size = size;<br />    }<br /><br />    //dodajemy gettery i settery<br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getOcurrance() {<br />        return ocurrance;<br />    }<br /><br />    public void setOcurrance(String ocurrance) {<br />        this.ocurrance = ocurrance;<br />    }<br /><br />    public int getSize() {<br />        return size;<br />    }<br /><br />    public void setSize(int size) {<br />        this.size = size;<br />    }<br /><br />    //dodajemy toString<br />    @Override<br />    public String toString() {<br />        return "Animals{" +<br />                "name='" + name + '\'' +<br />                ", ocurrance='" + ocurrance + '\'' +<br />                ", size=" + size +<br />                '}';<br />    }<br />}</pre>
<p><strong>plik ArrayListIterator.java</strong></p>
<pre>import java.util.ArrayList;<br />import java.util.Iterator;<br /><br />public class ArrayListIterator {<br />    public static void main(String[] args) {<br />        //tworzymy kolekcję przechowującą typ Animal<br />        ArrayList&lt;Animals&gt; animal = new ArrayList&lt;&gt;();<br /><br />        //uzupełniamy kolekcję<br />        animal.add(new Animals("Ryś", "Europe", 2));<br />        animal.add(new Animals("Frog", "All world", 1));<br />        animal.add(new Animals("Lion","Africa", 3));<br />        animal.add(new Animals("Medusa", "Oceans", 1));<br /><br />        //Jak możemy iterować listy<br />        //1. pętla for<br />        System.out.println("\nPętla for:");<br />        for (int i = 0; i&lt;animal.size(); i++){//możemy ją stosowac gdy chcemy rozpocząc iterację od innego elementu niż 0<br />            Animals animals = animal.get(i);<br />            System.out.println(animals);<br />        }<br />        <br />        //2. pętla foreach<br />        System.out.println("\nPętla foreach:");<br />        for (Animals animals : animal) {<br />            System.out.println(animals);<br />        }<br /><br />        //3. Iterator<br />        System.out.println("\nIterator:");<br />        //iterator jest interfejsem, czyli pewnego rodzaju szablonem.<br />        Iterator&lt;Animals&gt; iterator = animal.iterator(); //jeżeli chcemy zobaczyć jakie metody udostępnia iterator, ustawiamy kursor na napisie Iterator i naciskamy ctrl+b lub ctrl+LPM<br />        //zastosujemy pętlę while, która sprawdzi, czy następny element listy istnieje<br />        while (iterator.hasNext()){<br />            Animals animals = iterator.next();//next() możemy użyć jeżeli wcześniej użyliśmy hasnext()<br />            System.out.println(animals);<br />        }<br /><br />        //-----------------------------------------------------------------<br />        //METODY<br /><br />        //domknięcia inaczej zwane wyrażeniem lambda - to taki skrócony zapis<br />        System.out.println("\nstosujemy wyrażenie lambda:");<br />        animal.iterator().forEachRemaining(element -&gt; {<br />            System.out.println(element);<br />        });<br /><br />        //tworzymy nową listę<br />        ArrayList&lt;String&gt; subject = new ArrayList&lt;&gt;();<br />        subject.add("PHP");<br />        subject.add("JAVA");<br />        subject.add("Python");<br />        subject.add("HTML");<br /><br />        //usuwamy elementy<br />        System.out.println("Usuwanie elementów");<br />        Iterator&lt;String&gt; iterator1 = subject.iterator();<br />        while (iterator1.hasNext()){<br />            String str = iterator1.next();//next() możemy użyć jeżeli wcześniej użyliśmy hasnext()<br />            //System.out.println(animals1);<br />            if (str.equalsIgnoreCase("HTML")){<br />                iterator1.remove();<br />            }<br />            System.out.println(subject);<br />        }<br /><br /><br /><br /><br />    }<br />}</pre>
<p> </p>
<h2>LinkedList</h2>
<p>LinkedList ma takie same metody jak ArrayList, ale jest listą powiązaną, dwukierunkową.<br />Poszczególne elementy mają powiązania z sąsiadującymi elementami. Ten typ sprawdza się przy iteracji i wielu modyfikacjach.</p>
<p>Przykład:</p>
<pre>import java.util.LinkedList;<br /><br />public class LinkedListExample {<br />    public static void main(String[] args) {<br />        LinkedList&lt;String&gt; ll = new LinkedList&lt;&gt;();<br />        ll.add("Pies");<br />        ll.add("Kot");<br />        String animal = "Papuga";<br />        ll.add(animal);<br />        System.out.println(ll);<br /><br />        //dodawanie na początku<br />        ll.addFirst("Rybki");<br /><br />        //dodawanie na końcu<br />        ll.addLast("Królik");<br /><br />        System.out.println(ll);<br /><br />        //pobieranie pierwszego elementu<br />        System.out.println(ll.getFirst());<br /><br />        //pobieranie ostatniego elementu<br />        System.out.println(ll.getLast());<br /><br />        //usuwanie pierwszego elementu<br />        System.out.println(ll.removeFirst());<br /><br />        //usuwanie ostatniego elementu<br />        System.out.println(ll.removeLast());<br /><br />        System.out.println(ll);<br /><br />        //sprawdzamy czy element występuje na liście<br />        System.out.println(ll.contains(animal));<br /><br />        ll.add("Pies");<br />        ll.add("Kot");<br />        System.out.println(ll);<br /><br />        //usuwanie wystąpienia pierwszego<br />        System.out.println(ll.removeFirstOccurrence("Pies"));<br /><br />        //usuwanie wystąpienia ostatniego<br />        System.out.println(ll.removeLastOccurrence("Kot"));<br /><br />        System.out.println(ll);<br /><br />        //dodawanie lub usuwanie elementów po indeksię będą wolniejsze niż w ArrayList ponieważ w LinkedList elementy są powiązane między sobą, posiadają referencje do sąsiadujących elementów<br />        ll.add(2,"królik");<br />        ll.set(0,"Rybki");<br />        System.out.println(ll.size());<br /><br />    }<br />}</pre>
<p> </p>
<h2>ListIterator</h2>
<p>Do iteracji list wykorzystuje się ListIterator, który posiada wiele przydatnych metod.</p>
<pre>import java.util.Iterator;<br />import java.util.LinkedList;<br />import java.util.ListIterator;<br /><br />public class ListIteratorExample {<br />    public static void main(String[] args) {<br /><br />        LinkedList&lt;String&gt; ll = new LinkedList&lt;&gt;();<br />        ll.add("Pierwszy");<br />        ll.add("Dwa");<br />        ll.add("Trzy");<br />        ll.add("Cztery");<br /><br />        //przeglądanie listy za pomoca while<br />        ListIterator&lt;String&gt; iterator = ll.listIterator();<br />        while(iterator.hasNext()){//sprawdzamy czy jest dostępny następny element<br />            String str = iterator.next();//pobieramy następny element<br /><br />            if(str.equalsIgnoreCase("Pierwszy")){<br />                iterator.set("Jeden");//podmieniamy pobrany element na inny<br />            }<br />            if(str.equalsIgnoreCase("Cztery")){<br />                iterator.add("Pięć");//dodajemy kolejny element do listy<br />            }<br />        }<br /><br /><br />        ListIterator&lt;String&gt; iterator1 = ll.listIterator();<br />        while(iterator1.hasNext()){//sprawdzamy czy jest dostępny następny element<br />            String str = iterator1.next();<br /><br />            if(str.equalsIgnoreCase("Pięć")){<br />                iterator1.remove();<br />            }<br />        }<br /><br />        //wyświetlimy listę po zmianach<br />        System.out.println("Lista po zmianach:");<br />        Iterator&lt;String&gt; itr = ll.iterator();<br />        while(itr.hasNext()){<br />            System.out.println(itr.next());<br />        }<br /><br />        //przeglądanie list od końca<br />        System.out.println("LIsta od tyłu:");<br />        ListIterator&lt;String&gt; iterator2 = ll.listIterator(ll.size());<br />        while (iterator2.hasPrevious()){//sprawdzamy czy jest dostępny poprzedni element<br />            String str = iterator2.previous();<br />            System.out.println(str);<br />        }<br />    }<br />}</pre>
<p> </p>
<h2>HashSet</h2>
<p>HashSet pozwala na stworzenie kolekcji elementów o unikalnym hashu, czyli unikalnym kodzie wyróżniającym dany element. HashSet nie pozwoli na dodanie do kolekcji więcej niż jednego unikalnego elementu.<br />Każdy kolejny element kolekcji ma swój unikalny hash.<br />HashSet nie zachowuje kolejności elementów.</p>
<p>Przykład:</p>
<p><strong>plik Animals.java</strong></p>
<pre>//tworzymy przykładową klasę i dodajemy konstruktor, gettery, settery i toString<br /><br />import java.util.Objects;<br /><br />public class Animals {<br />    private String name;<br /><br />    public Animals(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Animals{" +<br />                "name='" + name + '\'' +<br />                '}';<br />    }<br /><br />    //przesłaniamy metody celem uniknięcia problemu duplikaji elementów na liście<br />    //zaczynamy pisać public boolean i wybieramy opcję z listy, klikamy next... next.. itd<br /><br />    @Override<br />    public boolean equals(Object o) {<br />        if (this == o) return true;<br />        if (o == null || getClass() != o.getClass()) return false; //jeżeli przekazany obiekt jest null lub nie zgadzają się klasy to zwraca false<br />        Animals animals = (Animals) o; //konwertuje obiekt na  animals<br />        // poniższą linijkę modyfikujemy<br />        // return Objects.equals(name, animals.name);<br />        return this.name.equals(animals.getName()); //sprawdzamy czy nazwy są takie same<br />    }<br /><br />    @Override<br />    public int hashCode() {<br />        return Objects.hash(name);<br />    }<br />}</pre>
<p><strong>plik HashSetExample.java</strong></p>
<pre>import java.util.HashSet;<br />import java.util.Iterator;<br /><br />public class HashSetExample {<br />    public static void main(String[] args) {<br />        //spróbujemy rozwiązać problem, który może się zdarzyć podczas stosowania HashCode: kiedy nowo stworzony obiekt przypiszemy do zmiennej i dodamy do kolekcji, a następnie<br />        //dodamy następny element za pomocą add(), to oba elementy znajdą się na liście (będą miały różne hashe, a taką samą wartość)<br /><br />        HashSet&lt;Animals&gt; animal = new HashSet&lt;&gt;();<br />        Animals animal1 = new Animals("dog"); //tworzymy nowy obiekt o unikalnym hashu<br />        //próbujemy dodać 2 razy ten sam obiekt - 2 razy ten sam hash<br />        animal.add(animal1);<br />        animal.add(animal1);//ten element nie zostanie dodany, bo na liście jest już element o takim hashu<br />        animal.add(new Animals("cat"));<br />        animal.add(new Animals("fish"));<br />        animal.add(new Animals("dog")); //ten element zostanie dodany pomimo, że "dog" już istnieje na liście, bo ma inny hash<br />        //przeglądamy naszą kolekcję<br />        Iterator&lt;Animals&gt; iterator = animal.iterator();//tworzymy iterator typu Animals - tak jak nazwa klasy<br />        while (iterator.hasNext()){<br />            Animals a = iterator.next();<br />            System.out.println(a);<br />        }<br />        /*<br />        W wyniku działania programu mamy 2 razy ten sam wpis, a tego chcemy uniknąć<br />        Animals{name='dog'}<br />        Animals{name='fish'}<br />        Animals{name='cat'}<br />        Animals{name='dog'}<br /><br />        musimy przesłonić 2 metody w klasie Animals - equals i hashcode i to rozwiąże problem<br />         */<br />    }<br />}</pre>
<p> </p>
<h2>TreeSet</h2>
<p>TreeSet używamy do dużych zbiorów, sortuje on od razu rosnąco wszystkie elementy.<br />Do porównywania elementów tej samej klasy będziemy używali interfejsu Comparator i będziemy przesłaniali metodę compare.</p>
<pre>import java.util.Iterator;<br />import java.util.TreeSet;<br /><br /><br />public class TreeSetExample {<br />    public static void main(String[] args) {<br />        TreeSet&lt;Integer&gt; ts = new TreeSet&lt;&gt;();<br />        ts.add(12);<br />        ts.add(10);<br />        ts.add(5);<br />        ts.add(25);<br /><br />        //korzystamy z iteratora<br />        Iterator&lt;Integer&gt; it = ts.iterator();<br />        while (it.hasNext()){<br />            System.out.println(it.next()); //otrzymuje posortowaną rosnąco listę<br />        }<br /><br />        //iteracja od końca<br />        Iterator&lt;Integer&gt; di = ts.descendingIterator();<br />        while (di.hasNext()){<br />            System.out.println(di.next());<br />        }<br />    }<br />}</pre>
<p> </p>
<h2>TreeSet i Comparator</h2>
<pre>import java.util.Comparator;<br />import java.util.TreeSet;<br /><br />/*<br />jeżeli w TreeSet korzystamy z własnych klas to używamy komparatora<br /> */<br />//stwórzmy klasę w tym samym pliku<br />class Animals{<br />    private String name;<br /><br />    public Animals(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Animals{" +<br />                "name='" + name + '\'' +<br />                '}';<br />    }<br /><br />}<br /><br />//tworzymy nową klasę na bazie interfejsu Comparator, która umożliwi porównywanie elementów<br />class AnimalsComparator implements Comparator&lt;Animals&gt;<br />{<br />    //zaimplementujemy metody<br /><br />    @Override<br />    public int compare(Animals o1, Animals o2) {<br />        //return 0;<br />        return o1.getName().compareTo(o2.getName());//tak porównamy 2 elementy<br />    }<br />}<br />public class TreeSetComparator {<br />    public static void main(String[] args) {<br />        TreeSet&lt;Animals&gt; animal = new TreeSet&lt;&gt;(new AnimalsComparator());//przekazujemy do konstruktora element AnimalsComparator<br />        animal.add(new Animals("dog"));<br />        animal.add(new Animals("cat"));<br />        animal.add(new Animals("fish"));<br />        animal.add(new Animals("rabbit"));<br /><br />        for (Animals a : animal) {<br />            System.out.println(a);<br />        }<br />        /*<br />        Otrzymujemy posortowaną listę<br />        Animals{name='cat'}<br />        Animals{name='dog'}<br />        Animals{name='fish'}<br />        Animals{name='rabbit'}<br />         */<br />    }<br />}</pre>
<p> </p>
<h2>HashMap</h2>
<p>W języku Java nie istnieje tablica asocjacyjna, tak jak np. w PHP (tablica asocjacyjna pozwala na zamieanę indeksów liczbowych na słowne) i tu z pomocą przychodzi nam HashMap.<br />Iterując mapę musimy odwołać się do entrySet().</p>
<pre>import java.util.HashMap;<br />import java.util.Iterator;<br />import java.util.Map;<br /><br />class Employee{<br />    private String name;<br /><br />    public Employee(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Employee{" +<br />                "name='" + name + '\'' +<br />                '}';<br />    }<br />}<br />public class HashMapExample {<br />    public static void main(String[] args) {<br />        HashMap&lt;String, Employee&gt; map = new HashMap&lt;&gt;(); //w nawiasach&lt;&gt; przekazujemy pary klucz-&gt;wartość<br />        //dodamy teraz kilka elementów<br />        map.put("worker", new Employee("Andrzej"));<br />        map.put("manager", new Employee("Janina"));<br />        map.put("HR", new Employee("Stefan"));<br />        map.put("CEO", new Employee("Kasia"));<br /><br />        //pobierzemy wartość przechowywaną w kluczu CEO<br />        Employee emp = map.get("CEO");<br />        System.out.println(emp);<br /><br />        //wykonamy teraz iterację<br />        Iterator i = map.entrySet().iterator();<br />        //zastosowanie pętli while<br />        while (i.hasNext()){<br />            Map.Entry me = (Map.Entry) i.next(); //dokonujemy rzutowania<br />            String key = (String) me.getKey(); //pobieramy klucz<br />            Employee value = (Employee) me.getValue();//pobieramy wartość<br />            System.out.println(key + " - " + value);<br />        }<br />        //zastosowanie pętli foreach<br />        for (Map.Entry&lt;String, Employee&gt; e : map.entrySet()) {<br />            String key = e.getKey(); //pobieramy klucz<br />            Employee value = e.getValue();//pobieramy wartość<br />            System.out.println(key + " - " + value);<br />        }<br />    }<br />}</pre>
<p> </p>
<h2>PriorityQueue</h2>
<p>PriorityQueue(czyt. pioriti kju), kolejki</p>
<p>Przykład:</p>
<pre>import java.util.PriorityQueue;<br /><br />public class PriorityQueueExample {<br />    public static void main(String[] args) {<br /><br />        //peek - pobiera element z kolejki, ale go nie usuwa<br />        //poll - wyciąga element z kolejki, usuwa go<br /><br />        //tworzymy kolejkę priorytetów przechowującą liczby<br />        PriorityQueue&lt;Integer&gt; pqInt = new PriorityQueue&lt;&gt;();<br />        //dodajemy elementy do kolejki<br />        pqInt.add(17);<br />        pqInt.add(1);<br />        pqInt.add(66);<br />        pqInt.add(44);<br />        System.out.println(pqInt.peek()); //kolejka jest już posortowana, możemy to zobaczyć wyświetlając pierwszy element<br />        //celowo użyłam peek, aby nie usunąć elementu z kolejki<br /><br />        //wylistujmy kolejkę<br />        //użyjemy metody poll, która usuwa elementy z kolejki więc po wylistowaniu wszystkich będzie pusta<br />        //korzystamy z pętli while, która ma się zatrzymać kiedy nie będzie elementów w kolejce<br />        while(!pqInt.isEmpty()){//sprawdzamy czy pqInt nie jest pusty<br />            System.out.println(pqInt.poll());<br />        }<br /><br />        //dodamy następne elementy<br />        for (int i = 13; i &gt; 10; i--) {<br />            pqInt.add(i) ;<br />        }<br /><br />        //wyświetlamy pierwszy element kolejki<br />        System.out.println("pierwszy element kolejki: " + pqInt.peek());<br /><br />        while(!pqInt.isEmpty()){//sprawdzamy czy pqInt nie jest pusty<br />            System.out.println(pqInt.poll());//listujemy kolejkę, widzimy że pierwszy element nadal jest<br />        }<br /><br />        //już nic tam nie ma<br />        System.out.println("Końcowa PriorityQueue: " + pqInt);<br /><br /><br />        //SORTOWANIE KOLEJEK<br /><br />        //Comparator - interfejs Javy, który służy do kontroli nad sortowaniem elementów<br /><br />        //SORTOWANIE ROZSNĄCO<br />        //tworzymy kolejkę priorytetów przechowującą liczby z komparatorem rosnącym<br />        PriorityQueue&lt;Integer&gt; pqIntASC = new PriorityQueue&lt;&gt;(new PriorityQueueAndComparatorASC());//musimy przekazać do konstruktora nowy obiekt klasy PriorityQueueAndComparatorASC<br /><br />        //dodajemy elementy do kolejki<br />        pqIntASC.add(17);<br />        pqIntASC.add(1);<br />        pqIntASC.add(66);<br />        pqIntASC.add(44);<br /><br />        //wylistujmy kolejkę<br />        //użyjemy metody poll, która usuwa elementy z kolejki więc po wylistowaniu wszystkich będzie pusta<br />        //korzystamy z pętli while, która ma się zatrzymać kiedy nie będzie elementów w kolejce<br />        System.out.println("kolejka posortowana rosnąco przez komparator");<br />        while(!pqIntASC.isEmpty()){//sprawdzamy czy pqInt nie jest pusty<br />            System.out.println(pqIntASC.poll());<br />        }<br /><br />        //SORTOWANIE MALEJĄCO<br />        //tworzymy kolejkę priorytetów przechowującą liczby z komparatorem malejącym<br />        PriorityQueue&lt;Integer&gt; pqIntDESC = new PriorityQueue&lt;&gt;(new PriorityQueueAndComparatorDESC());//musimy przekazać do konstruktora nowy obiekt klasy PriorityQueueAndComparatorDESC<br /><br />        //dodajemy elementy do kolejki<br />        pqIntDESC.add(17);<br />        pqIntDESC.add(1);<br />        pqIntDESC.add(66);<br />        pqIntDESC.add(44);<br /><br />        //wylistujmy kolejkę<br />        //użyjemy metody poll, która usuwa elementy z kolejki więc po wylistowaniu wszystkich będzie pusta<br />        //korzystamy z pętli while, która ma się zatrzymać kiedy nie będzie elementów w kolejce<br />        System.out.println("kolejka posortowana malejąco przez komparator");<br />        while(!pqIntDESC.isEmpty()){//sprawdzamy czy pqInt nie jest pusty<br />            System.out.println(pqIntDESC.poll());<br />        }<br /><br />        //SORTOWANIE PO DŁUGOŚCI<br />        //tworzymy kolejkę przechowującą wpisy i będziemy je sortować wg długości znaków<br />        PriorityQueue&lt;String&gt; pqIntLength = new PriorityQueue&lt;&gt;(new PriorityQueueAndComparatorLength());//musimy przekazać do konstruktora nowy obiekt klasy PriorityQueueAndComparatorLength<br /><br />        //dodajemy elementy do kolejki<br />        pqIntLength.add("mały");<br />        pqIntLength.add("najdłuższy");<br />        pqIntLength.add("średni");<br /><br />        //wylistujmy kolejkę<br />        //użyjemy metody poll, która usuwa elementy z kolejki więc po wylistowaniu wszystkich będzie pusta<br />        //korzystamy z pętli while, która ma się zatrzymać kiedy nie będzie elementów w kolejce<br />        System.out.println("kolejka posortowana rosnąco przez komparator wg długości znaków");<br />        while(!pqIntLength.isEmpty()){//sprawdzamy czy pqInt nie jest pusty<br />            System.out.println(pqIntLength.poll());<br />        }<br /><br /><br />        //COMPARABLE vs COMPARATOR i SORTOWANIE PO PRIORYTECIE<br />        /*<br />        Poznaliście do tej pory Comparator, który pozwala porównać ze sobą 2 różne obiekty, np. gdy trzeba porównać ludzi wg wieku, imienia itp.<br />        Comparable pozwala porównać "siebie" z innym obiektem<br />        */<br />        //tworzymy nową kolejkę<br />        PriorityQueue&lt;PriorityQueueAndComparable&gt; comparable = new PriorityQueue&lt;&gt;();<br />        //stwórzmy sobie listę języków do nauczenia się z priorytetami<br />        comparable.add(new PriorityQueueAndComparable(1, "Python"));<br />        comparable.add(new PriorityQueueAndComparable(4, "PHP"));<br />        comparable.add(new PriorityQueueAndComparable(3, "Java"));<br />        comparable.add(new PriorityQueueAndComparable(2, "C++"));<br /><br />        //te elementy będą z automatu porównywane z tymi, które znajdują się w kolejce<br />        while (!comparable.isEmpty()){<br />            System.out.println(comparable.poll());<br />        }<br /><br />        //a teraz rozwiązanie powyższego z użyciem komparatora<br />        PriorityQueue&lt;PriorityQueueAndComparator&gt; comparator = new PriorityQueue&lt;&gt;();<br />        //stwórzmy sobie listę języków do nauczenia się z priorytetami<br />        comparable.add(new PriorityQueueAndComparable(1, "Python"));<br />        comparable.add(new PriorityQueueAndComparable(4, "PHP"));<br />        comparable.add(new PriorityQueueAndComparable(3, "Java"));<br />        comparable.add(new PriorityQueueAndComparable(2, "C++"));<br /><br />        //te elementy będą z automatu porównywane z tymi, które znajdują się w kolejce<br />        while (!comparator.isEmpty()){<br />            System.out.println(comparator.poll());<br />        }<br />    }<br />}</pre>
<p> </p>
<h2>PriorityQueue, Comparable i Comparator</h2>
<p>Stworzymy listę priorytetów, którą musimy posortować na kilka sposobów:</p>
<p><strong>plik PriorityQueueAndComparable.java</strong></p>
<pre>public class PriorityQueueAndComparable implements Comparable&lt;PriorityQueueAndComparable&gt;{<br /><br />    //dodajemy 2 pola klasy<br />    private int priority;//pole z priorytetem zadania<br />    private String name;<br /><br />    //dodajemy następujące elementy: konstruktor, gettery i settery oraz toString<br />    //implementujemy metodę CompareTo, którą musimy lekko zmodyfikować<br /><br />    public PriorityQueueAndComparable(int priority, String name) {<br />        this.priority = priority;<br />        this.name = name;<br />    }<br /><br />    public int getPriority() {<br />        return priority;<br />    }<br /><br />    public void setPriority(int priority) {<br />        this.priority = priority;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "PriorityQueueAndComparable{" +<br />                "priority=" + priority +<br />                ", name='" + name + '\'' +<br />                '}';<br />    }<br /><br />    @Override<br />    //będziemy porównywali ten element z tym co przekaże Java w nawiasie<br />    public int compareTo(PriorityQueueAndComparable o) {<br />        //ustawiamy wartość z tego obiektu jako "a" i przekazaną jako parametr wartość jako "b" i dokonujemy porównania<br />        int a = this.priority;<br />        int b = o.priority;<br />        if(a==b) return 0;<br />        if (a&gt;b)<br />            return 1;<br />        else<br />            return -1;<br />    }<br />}</pre>
<p><strong>plik PriorityQueueAndComparator.java</strong></p>
<pre>import java.util.Comparator;<br /><br />//tworzymy nową klasę, która implementuje metody z Comparator wykorzystując klasę PriorityQueueAndComparable<br />public class PriorityQueueAndComparator implements Comparator&lt;PriorityQueueAndComparable&gt; {<br />    //implementujemy metodę Compare<br /><br />    @Override<br />    public int compare(PriorityQueueAndComparable o1, PriorityQueueAndComparable o2) {<br />        //porównamy 2 elementy o1 i o2<br />        int a = o1.getPriority();<br />        int b = o2.getPriority();<br />        if(a==b) return 0;<br />        if(a&gt;b) //kolejność rosnąca<br />            return 1;<br />        else<br />            return -1;<br />    }<br />}</pre>
<p><strong>plik PriorityQueueAndComparatorLength.java</strong></p>
<pre>import java.util.Comparator;<br />//będziemy sortować wpisy wg długości znaków<br />public class PriorityQueueAndComparatorLength implements Comparator&lt;String&gt; {<br />    @Override<br />    public int compare(String str1, String str2) {<br />        return str1.length()-str2.length();//dla kolejności od najkrótszego do najdłuższego<br />        //return str2.length()-str1.length();//dla kolejności od najkrótszego do najdłuższego<br />    }<br />}</pre>
<p><strong>plik PriorityQueueAndComparatorASC.java</strong></p>
<pre>import java.util.Comparator;<br /><br />//KOLEJNOŚĆ ROSNĄCA<br />//tworzymy klasę implementującą komparator<br />public class PriorityQueueAndComparatorASC implements Comparator&lt;Integer&gt; {<br />    //ALT+g i implementujemy metodę - compare, którą musimy lekko zmienić<br />    //sprawdzimy 3 warunki jeżeli elementy są równe, jeden jest mniejszy lub większy<br />    @Override<br />    public int compare(Integer x, Integer y) {<br />        if (x==y) return 0;<br />        if(x&gt;y)<br />            return 1;<br />        else<br />            return -1;<br />    }<br />}</pre>
<p><strong>plik PriorityQueueAndComparatorASC.java</strong></p>
<pre>import java.util.Comparator;<br /><br />//KOLEJNOŚĆ MALEJĄCA<br />//tworzymy klasę implementującą komparator<br />public class PriorityQueueAndComparatorDESC implements Comparator&lt;Integer&gt; {<br />    //ALT+g i implementujemy metodę - compare, którą musimy lekko zmienić<br />    //sprawdzimy 3 warunki jeżeli elementy są równe, jeden jest mniejszy lub większy<br />    @Override<br />    public int compare(Integer x, Integer y) {<br />        if (x==y) return 0;<br />        if(x&lt;y)<br />            return 1;<br />        else<br />            return -1;<br />    }<br />}</pre>
<p> </p>
<p><strong>Zadanie 1</strong>:</p>
<p>Napisz program, który sprawdzi czy podany element (<em>target)</em> znajduje się w posortowanej liście (<em>numbers).</em> Zadeklaruj:</p>
<p>listę postaci [1, 2, 3, 4, 5, 6, 7, 8, 9]</p>
<p>zmienną target = 7</p>
<p><em>Zasada działania algorytmu:</em></p>
<ol>
<li>Ustalamy indeks startowy (<em>start) </em>oraz końcowy (<em>end) </em>oraz flagę <em>flag = None.</em></li>
<li>Dopóki indeks startowy jest nie większy niż indeks końcowy wybieramy środkowy indeks (<em>mid</em>) listy (średnia arytmetyczna indeksu startowego i końcowego -&gt; należy pamiętać o skonwertowaniu wyniku funkcją <em>int</em>). Jeżeli indeks startowy jest większy niż indeks końcowy kończymy działanie algorytmu.</li>
<li>Sprawdzamy czy element listy dla tak obliczonego indeksu jest naszym szukanym (<em>target</em>). Jeżeli tak, ustawiamy flagę <em>flag</em> na wartość <em>True</em> i kończymy działanie algorytmu. Jeżeli nie -&gt; krok 4.</li>
<li>Sprawdzamy, czy wartość elementu listy dla indeksu <em>mid</em> jest mniejsza niż <em>target. </em>Jeśli tak, to zwiększamy indeks startowy o 1. Jeśli nie, zmniejszamy indeks końcowy o 1 i przechodzimy do kroku 2.</li>
</ol>
<p>Po wykonaniu pętli <em>while</em> w zależności od wartości flagi <em>flag</em> wydrukuj do konsoli tekst: 'Znaleziono&#8217;, 'Nie znaleziono&#8217;.</p>
<p><em>Oczekiwany wynik:</em></p>
<p>Znaleziono</p>
<p><strong>Zadanie 2: </strong>Zadeklaruj listę liczb:</p>
<p>items = [1, 3, 4, 5, 6, 9, 10, 17, 23, 24]</p>
<p>Napisz program, który usunie liczby nieparzyste i zwróci pozostałe. Wynik wydrukuj do konsoli.</p>
<p><em>Oczekiwany wynik:</em></p>
<p>[4, 6, 10, 24]</p>
<p><strong>Zadanie 3:</strong></p>
<p>Zadeklaruj listę liczb:</p>
<p>items = [1, 5, 3, 2, 2, 4, 2, 4]</p>
<p>Napisz program, który usunie duplikaty z listy (kolejność musi zostać zachowana).</p>
<p><em>Oczekiwany wynik:</em></p>
<p>[1, 5, 3, 2, 4]</p>
<section class="entry-content ">
<p><strong>Zadanie 4:</strong></p>
<p>Zadeklaruj listę postaci: probabilities = [0.21, 0.91, 0.34, 0.55, 0.76, 0.02]</p>
<p>Napisz program, który z podanej listy zwróci listę wartości powyżej ustalonego progu 0.5.</p>
<p><em>Oczekiwany wynik:</em></p>
<p>[0.91, 0.55, 0.76]</p>
<p><strong>Zadanie 5:</strong></p>
<p>Rozważmy problem klasyfikacji binarnej. Model uczenia maszynowego zwraca prawdopodobieństwo przynależności do klasy. Jeżeli jest ono mniejsze niż 0.5 próbka zostaje przypisana do klasy 0, przeciwnie do klasy 1.</p>
<p>Podana jest lista prawdopodobieństw otrzymanych z modelu uczenia maszynowego:</p>
<p>probabilities = [0.21, 0.91, 0.34, 0.55, 0.76, 0.02]</p>
<p>Napisz program, który przypisze klasę 0 dla wartości mniejszych niż 0.5 oraz 1 dla wartości większych lub równych 0.5. Wynik w postaci listy wydrukuj do konsoli.</p>
<p><em>Oczekiwany wynik:</em></p>
<p>[0, 1, 0, 1, 1, 0]</p>
<p> </p>
</section>
<div>
<p><strong>Zadanie 6:</strong> Napisz program, który porówna dwie listy i zwróci wartość <em>True </em>w przypadku gdy listy będą zawierały co najmniej jeden ten sam element. W przeciwnym razie zwróci wartość <em>False</em>. Użyj instrukcji <em>break.</em></p>
<p>Podane listy:</p>
<ol>
<li>list1 = [1, 2, 0]</li>
<li>list2 = [4, 5, 6, 1]</li>
</ol>
<p>Wynik wydrukuj do konsoli.</p>
<p><strong>Zadanie 7:</strong> Podana jest lista <em>hashtags</em>:</p>
<ol>
<li>hashtags = [&#8217;holiday&#8217;, 'sport&#8217;, 'fit&#8217;, None, 'fashion&#8217;]</li>
</ol>
<p>Sprawdź, czy każdy obiekt z listy jest obiektem klasy <em>str</em>. Jeżeli tak wydrukuj wartość <em>True</em>, w przeciwnym przypadku wydrukuj wartość <em>False</em>. Użyj instrukcji <em>break</em>.</p>
<p><strong>Zadanie 8:</strong></p>
<p>Podana jest lista spółek z indeksu <strong>WIG.GAMES</strong> wraz z ceną zamknięcia i walutą:</p>
<p>gaming = {</p>
<p>&#8217;11B&#8217;: [362.5, 'PLN&#8217;],</p>
<p>&#8217;CDR&#8217;: [74.25, 'USD&#8217;],</p>
<p>&#8217;CIG&#8217;: [0.85, 'PLN&#8217;],</p>
<p>&#8217;PLW&#8217;: [79.5, 'USD&#8217;],</p>
<p>&#8217;TEN&#8217;: [300.0, 'PLN&#8217;]</p>
<p>}</p>
<p>Używając instrukcji <em>continue</em> zbuduj pętlę, która pozwoli zmienić cenę zamknięcia wyrażoną w USD na PLN. Przyjmij kurs USDPLN = 4.0.</p>
<p>Słownik <em>gaming</em> wydrukuj do konsoli.</p>
<p><strong>Pomocniczy wynik:</strong></p>
<p>{&#8217;11B&#8217;: [362.5, 'PLN&#8217;],</p>
<p>&#8217;CDR&#8217;: [297.0, 'PLN&#8217;],</p>
<p>&#8217;CIG&#8217;: [0.85, 'PLN&#8217;],</p>
<p>&#8217;PLW&#8217;: [318.0, 'PLN&#8217;],</p>
<p>&#8217;TEN&#8217;: [300.0, 'PLN&#8217;]}</p>
<p><strong>Oczekiwany wynik:</strong></p>
<p>{&#8217;11B&#8217;: [362.5, 'PLN&#8217;], 'CDR&#8217;: [297.0, 'PLN&#8217;], 'CIG&#8217;: [0.85, 'PLN&#8217;], 'PLW&#8217;: [318.0, 'PLN&#8217;], 'TEN&#8217;: [300.0, 'PLN&#8217;]}</p>
<p><strong>Zadanie 9:</strong></p>
<p>Podana jest niepełna lista imion (jednego brak):</p>
<p>names = [&#8217;Jack&#8217;, 'Leon&#8217;, 'Alice&#8217;, None, 'Bob&#8217;]</p>
<p>Lista składa się tylko z obiektów typu <em>str </em>lub wartości <em>None</em>. Posługując się instrukcją <em>continue </em>wydrukuj do konsoli tylko poprawnie przekazane imiona (obiekty typu <em>str</em>).</p>
<p><strong>Oczekiwany wynik:</strong></p>
<p>Jack</p>
<p>Leon</p>
<p>Alice</p>
<p>Bob</p>
</div>
<p> </p>
<p><strong>Zadanie 10:</strong></p>
<p>Podana jest poniższa lista:</p>
<p>project_ids = [&#8217;02134&#8242;, '24253&#8242;]</p>
<p>Sprawdź czy następujące id projektu:</p>
<p>project_id = '02135&#8242;</p>
<p>występuje w liście <em>project_ids. </em>Jeśli nie dodaj id tego projektu do listy. Następnie wydrukuj listę <em>project_ids </em>do konsoli.</p>
<p> </p>
<p><em>Oczekiwany wynik:</em></p>
<p>[&#8217;02134&#8242;, '24253&#8242;, '02135&#8242;]</p>
<p><strong>Zadanie 11:</strong></p>
<p>Napisz program, który utworzy histogram &#8211; rozkład częstości w postaci słownika z podanych wartości:</p>
<p>items = [&#8217;x&#8217;, 'y&#8217;, 'z&#8217;, 'y&#8217;, 'x&#8217;, 'y&#8217;, 'y&#8217;, 'z&#8217;, 'x&#8217;]</p>
<p>W odpowiedzi utworzony słownik wydrukuj do konsoli.</p>
<p><em>Oczekiwany wynik:</em></p>
<p>{&#8217;x&#8217;: 3, 'y&#8217;: 4, 'z&#8217;: 2}</p>
<p><strong> </strong></p>
<p><strong>Zadanie 12:</strong></p>
<p>Podana jest lista indeksów notowanych na GPW:</p>
<p>indexes = [</p>
<p>    &#8222;WIG&#8221;,</p>
<p>    &#8222;WIG-banki&#8221;,</p>
<p>    &#8222;WIG-budownictwo&#8221;,</p>
<p>    &#8222;WIG-CEE&#8221;,</p>
<p>    &#8222;WIG-chemia&#8221;,</p>
<p>    &#8222;WIG-energia&#8221;,</p>
<p>    &#8222;WIG-ESG&#8221;,</p>
<p>    &#8222;WIG-górnictwo&#8221;,</p>
<p>    &#8222;WIG-informatyka&#8221;,</p>
<p>    &#8222;WIG-leki&#8221;,</p>
<p>    &#8222;WIG-media&#8221;,</p>
<p>    &#8222;WIG-motoryzacja&#8221;,</p>
<p>    &#8222;WIG-nieruchomości&#8221;,</p>
<p>    &#8222;WIG-odzież&#8221;,</p>
<p>    &#8222;WIG-paliwa&#8221;,</p>
<p>    &#8222;WIG-Poland&#8221;,</p>
<p>    &#8222;WIG-spożywczy&#8221;,</p>
<p>    &#8222;WIG-telekomunikacja&#8221;,</p>
<p>    &#8222;WIG-Ukraine&#8221;,</p>
<p>    &#8222;WIG.GAMES&#8221;,</p>
<p>    &#8222;WIG.MS-BAS&#8221;,</p>
<p>    &#8222;WIG.MS-FIN&#8221;,</p>
<p>    &#8222;WIG.MS-PET&#8221;,</p>
<p>    &#8222;WIG20&#8221;,</p>
<p>    &#8222;WIG20dvp&#8221;,</p>
<p>    &#8222;WIG20lev&#8221;,</p>
<p>    &#8222;WIG20short&#8221;,</p>
<p>    &#8222;WIG20TR&#8221;,</p>
<p>    &#8222;WIG30&#8221;,</p>
<p>    &#8222;WIG30TR&#8221;,</p>
<p>    &#8222;WIGdiv&#8221;,</p>
<p>    &#8222;WIGtech&#8221;,</p>
<p>]</p>
<p>Dokonaj iteracji po liście <em>indexes</em> oraz wydrukuj do konsoli tylko te indeksy, które zwierają w nazwie &#8217;20&#8217; lub &#8217;30&#8217;.</p>
<p><em>Oczekiwany wynik:</em></p>
<p>WIG20</p>
<p>WIG20dvp</p>
<p>WIG20lev</p>
<p>WIG20short</p>
<p>WIG20TR</p>
<p>WIG30</p>
<p>WIG30TR</p>
<p><strong>Zadanie 13:</strong></p>
<p>Podany jest słownik spółek z indeksu sektorowego WIG.GAMES. Kluczem jest 3-literowy kod spółki (ticker), wartością cena zamknięcia:</p>
<p>gaming = {</p>
<p>    &#8217;11B&#8217;: 362.5,</p>
<p>    'CDR&#8217;: 297.0,</p>
<p>    'CIG&#8217;: 0.85,</p>
<p>    'PLW&#8217;: 318.0,</p>
<p>    'TEN&#8217;: 300.0</p>
<p>}</p>
<p> </p>
<p>Przeprowadź iterację po słowniku. Wydrukuj kody (tickery) tych spółek, których cena zamknięcia jest większa niż 100.00 PLN.</p>
<p><em>Oczekiwany wynik:</em></p>
<p>11B</p>
<p>CDR</p>
<p>PLW</p>
<p>TEN</p>
<p><strong>Zadanie 14:</strong> Podana jest lista imion wprowadzonych do systemu przez użytkowników (bez procesu walidacji):</p>
<p>names = [&#8217;Jack&#8217;, 'Leon&#8217;, 'Alice&#8217;, &#8217;32-3c&#8217;, 'Bob&#8217;]</p>
<p>Sprawdź, czy każde imię jest poprawne (składa się tylko z liter). Jeżeli tak, wynik wydrukuj do konsoli w następującej postaci, np. Hello Jack!</p>
<p><em>Wskazówka</em><strong>: </strong>Użyj metody str.isalpha()<em>.</em></p>
<p><em>Oczekiwany wynik:</em></p>
<p>Hello Jack!</p>
<p>Hello Leon!</p>
<p>Hello Alice!</p>
<p>Hello Bob!</p>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/16-java-kolekcje/">16. JAVA &#8211; kolekcje</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>15. JAVA &#8211; wyjątki</title>
		<link>https://kamakaczmarek.net/15-java-wyjatki/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Tue, 12 Oct 2021 15:35:18 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[wyjątki]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3299</guid>

					<description><![CDATA[<p>W Java występują błędy kompilacji oraz wyjątki, które mogą się pojawić w trakcie trwania programu. W takim wypadku skrypt kończy swoje działanie, a istnieją sytuacje, w których nie jest to konieczne np. praca na nieistniejącym pliku.Możliwe błędy najlepiej przechwycić w trakcie wykonywania skryptu, żeby nie powodować sytuacji, w której program zakończy swoje działanie błędem. Mówimy, [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/15-java-wyjatki/">15. JAVA &#8211; wyjątki</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>W Java występują błędy kompilacji oraz wyjątki, które mogą się pojawić w trakcie trwania programu. W takim wypadku skrypt kończy swoje działanie, a istnieją sytuacje, w których nie jest to konieczne np. praca na nieistniejącym pliku.<br />Możliwe błędy najlepiej przechwycić w trakcie wykonywania skryptu, żeby nie powodować sytuacji, w której program zakończy swoje działanie błędem.</p>
<p>Mówimy, że wyjątki <strong>przechwytują błędy.</strong></p>
<p>Wyjątki wyświetlają stosowną informację dla użytkownika w przypadku błędu i umożliwiają kontynuację pracy skryptu.</p>
<p>Wyjątki są obiektami klasy <em><strong>Exception</strong></em>, które posiadają własny komunikat i kod błędu. Mogą one zostać wyłapane (try), rzucone (throw) i przechwycone (catch).</p>
<p> </p>
<h3>try…, catch…</h3>
<p>Przykład. Obsłużymy wyjątek polegający na odwołaniu się do nieistniejącego elementu w tablicy:</p>
<pre>public class TryCatch {<br />    public static void main(String[] args) {<br />        int[] numbers = {0,1,2,3,4,5,6};<br />        try{<br />            int nr = numbers[7]; //nie ma takiego elementu w tablicy<br />        } catch(ArrayIndexOutOfBoundsException e) { //możemy w nawiasie podać ogólnie typ klasy "Exception e" lub jak w tym przypadku podać konkretny rodzaj wyjątku<br />            System.out.println("Wystąpił błąd");<br />            //jeżeli potrzebujemy dodatkowych informacji na temat błędu warto skorzystać z metody printStackTrace<br />            e.printStackTrace();<br />        }<br />        System.out.println("Po obsłużeniu błędu program kontynuuje swoją pracę");<br />    }<br />}</pre>
<p> </p>
<h3>try…, catch…, finally&#8230;</h3>
<p>Jeżeli chcemy, aby instrukcja zawsze wywołała się bez względu na powstanie wyjątku lub nie, używamy bloku finally. Możemy tą instrukcję wykonać np. gdy chcemy zamknąć dany zasób po wykonaniu operacji na plikach.</p>
<p>Przykład. (modyfikujemy powyższy)</p>
<pre>public class TryCatchFinally {<br />    public static void main(String[] args) {<br />        int[] numbers = {0,1,2,3,4,5,6};<br />        try{<br />            int nr = numbers[7]; //nie ma takiego elementu w tablicy<br />        } catch(Exception e) {<br />            System.out.println("Wystąpił błąd: nie ma takiego elementu w tablicy");<br />        } finally {<br />            System.out.println("Instrukcja wywołana zawsze");<br />        }<br />        System.out.println("Po obsłużeniu błędu program kontynuuje swoją pracę");<br />    }<br />}</pre>
<p>Przykład. Obsługa więcej niż 1 wyjątku.</p>
<pre>public class TryCatchFinallyMoreThanOne {<br />    public static void main(String[] args) {<br />        int[] numbers = {0,1,2,3,4,5,6};<br />        try{<br />            int divide = 2/numbers[0]; //błąd dzielenia przez 0 - ten wyjątek wystąpi jako pierwszy więc ten komunikat się pojawi: Wystąpił błąd: nie wolno dzielić przez 0<br />            int nr = numbers[7]; //nie ma takiego elementu w tablicy<br />        } catch(ArrayIndexOutOfBoundsException e) {<br />            System.out.println("Wystąpił błąd: nie ma takiego indeksu w tablicy");<br />        } catch (ArithmeticException e){<br />            System.out.println("Wystąpił błąd: nie wolno dzielić przez 0");<br />        } finally {<br />            System.out.println("Instrukcja wywołana zawsze");<br />        }<br />        System.out.println("Po obsłużeniu błędu program kontynuuje swoją pracę");<br />    }<br />}</pre>
<p>Wiele wyjątków możemy zapisać razem, po znaku &#8222;|&#8221; np.</p>
<pre>catch(ArrayIndexOutOfBoundsException | ArithmeticException e)... </pre>
<p> </p>
<h3>throw…</h3>
<p>W zależności od potrzeb, wyjątki możemy też zgłaszać.</p>
<pre>public class Throw {<br />    public static void main(String[] args) {<br />        try {<br />            int l1 = 2;<br />            int l2 = 0;<br /><br />            //będziemy wykonywali dzielenie liczb, a jak wiemy nie można dzielić przez 0<br />            //jeżeli dzielnik będzie 0 to tworzymy nowy obiekt klasy wyjątku<br />            if (l2 == 0) throw new ArithmeticException();<br />            int divide = l1 / l2;<br />        } catch (ArithmeticException ae) {<br />            System.out.println("Wystąpił błąd arytmetyczny");<br />            ae.printStackTrace();//wyświetlamy szczegóły<br />        }<br />        System.out.println("Program kontynuuje pracę");<br />    }<br />}</pre>
<p> </p>
<p>Możemy zdefiniować własną klasę wyjątku, dziedziczy ona po klasie Exception:</p>
<pre>import java.util.Random;<br /><br />class MyException extends Exception{<br />    public MyException(){<br />        System.out.println("Error");<br />    }<br />}<br /><br />public class ThrowClass {<br />    static void mozeZglosicWyjatek() throws MyException {<br />        int x = new Random().nextInt(5);<br />        if (x == 0) throw new MyException();<br />        System.out.println("Wylosowano " + x);<br />    }<br /><br />    public static void main(String[] args) {<br />        try {<br />            mozeZglosicWyjatek();<br />        } catch (MyException me) {<br />            System.out.println("Wylosowano 0, zgłaszam wyjątek");<br />        }<br />        System.out.println("Program kontynuuje pracę");<br />    }<br />}</pre>
<p> </p>
<p>Wyjątki możemy zgłaszać poprzez metodę:</p>
<pre>import java.util.Random;<br /><br />public class ThrowMethod {<br />    void mozeZglosicWyjatek() throws Exception {<br />        int x = new Random().nextInt(5);<br />        if (x == 0) throw new Exception();<br />        System.out.println("Wylosowano " + x);<br />    }<br /><br />    public static void main(String[] args) {<br /><br />        ThrowMethod z = new ThrowMethod();<br />        try {<br />            z.mozeZglosicWyjatek();<br />        } catch (Exception e) {<br />            System.out.println("Wylosowano 0, zgłaszam wyjątek");<br />        }<br />        System.out.println("Program kontynuuje pracę");<br />    }<br />}</pre>
<p> </p>
<h3>Przykład: Kalkulator.</h3>
<pre>import java.util.Scanner;<br /><br />public class Calculator {<br />    public static void main(String[] args) {<br />        Scanner user_data = new Scanner(System.in);<br /><br />        System.out.println("Podaj pierwszą liczbę: ");<br />        String l1 = user_data.nextLine();<br /><br />        System.out.println("Podaj drugą liczbę: ");<br />        String l2 = user_data.nextLine();<br /><br />        System.out.println("Podaj znak: ");<br />        String sign = user_data.nextLine();<br /><br />        try {<br />            int liczba1 = Integer.parseInt(l1);<br />            int liczba2 = Integer.parseInt(l2);<br /><br />            switch (sign) {<br />                case "+":<br />                    int sum = liczba1 + liczba2;<br />                    System.out.println(l1+"+"+l2 + "=" +String.valueOf(sum));<br />                    break;<br />                case "-":<br />                    int minus = liczba1 - liczba2;<br />                    System.out.println(l1+"-"+l2 + "=" +String.valueOf(minus));<br />                    break;<br />                case "*":<br />                    int multi = liczba1 * liczba2;<br />                    System.out.println(l1+"*"+l2 + "=" +String.valueOf(multi));<br />                    break;<br />                case "/":<br />                    float divide = (float)liczba1 / (float)liczba2;<br />                    System.out.println(l1+"/"+l2 + "=" +String.valueOf(divide));<br />                    break;<br /><br />                default:<br />                    System.out.println("Nierozpoznany wybór");<br />                    break;<br />            }<br />            /* //to samo tylko z ifami<br />            if(sign.equals("+")){<br />                int sum = liczba1 + liczba2;<br />                System.out.println(l1+"+"+l2 + "=" +String.valueOf(sum));<br />            } else if(sign.equals("-")){<br />                int minus = liczba1 - liczba2;<br />                System.out.println(l1+"-"+l2 + "=" +String.valueOf(minus));<br />            } else if(sign.equals("*")){<br />                int multi = liczba1 * liczba2;<br />                System.out.println(l1+"*"+l2 + "=" +String.valueOf(multi));<br />            } else if(sign.equals("/")){<br />                int divide = liczba1 / liczba2;<br />                System.out.println(l1+"/"+l2 + "=" +String.valueOf(divide));<br />            }<br />             */<br />        } catch (NumberFormatException e) {<br />            System.out.println("Pierwsza i druga wartość musi być liczbą");<br />        } catch (ArithmeticException e){<br />            System.out.println("Nie wolno dzilić przez 0");<br />        } finally {<br />            System.out.println("Wyjątki zostały obsłużone, program działa dalej.");<br />        }<br /><br />    }<br />}</pre>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/15-java-wyjatki/">15. JAVA &#8211; wyjątki</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>14. JAVA &#8211; obiektowo</title>
		<link>https://kamakaczmarek.net/14-java-obiektowo/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Mon, 11 Oct 2021 08:27:34 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[obiekty]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3262</guid>

					<description><![CDATA[<p>Programowanie obiektowe – OOP (object-oriented programming) – pozwala na przedstawienie rzeczywistości i relacji w niej zachodzących za pomocą obiektów.   Klasa i obiekt Kiedy mówimy o klasie musimy wyobrazić ją sobie jak ogólny zarys/opis jakiegoś obiektu, zbiór cech wspólnych dla np. człowieka. Gdybyśmy mieli klasę człowiek moglibyśmy określić ogólne cechy jakie definiują ludzi, czyli np. [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/14-java-obiektowo/">14. JAVA &#8211; obiektowo</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Programowanie obiektowe – OOP (object-oriented programming) – pozwala na przedstawienie rzeczywistości i relacji w niej zachodzących za pomocą obiektów.</p>
<p> </p>
<h2>Klasa i obiekt</h2>
<p>Kiedy mówimy o klasie musimy wyobrazić ją sobie jak ogólny zarys/opis jakiegoś obiektu, zbiór cech wspólnych dla np. człowieka. Gdybyśmy mieli klasę człowiek moglibyśmy określić ogólne cechy jakie definiują ludzi, czyli np. to że śpi, że ma głos, oczy, włosy, ręce, nogi itd.<br /><br />Obiekt jest instancją danej klasy, czyli konkretnym człowiekiem np. Janem Kowalskim, który ma brązowe włosy, jest typem „skowronka” i ma niebieskie oczy. Te cechy nie są bezpośrednio związane z klasą, a z obiektem (instancją/wystąpieniem klasy). <br />Można powiedzieć, że Jan Kowalski jest zmienną typu klasy, czyli obiektem typu człowiek.<br /><br />W Javie istnieje wiele &#8222;gotowych&#8221; klas, z których możemy korzystać. Zawierają one konkretne własności oraz metody. Poznaliście już klasę String, Integer i inne.</p>
<p>Już wiecie mniej więcej co to jest obiekt i klasa. Rozszerzając te zagadnienia możemy powiedzieć, że klasa jest schematem na bazie którego będziemy tworzyli obiekty np. mając projekt domu, możemy na jego podstawie stworzyć wiele podobnych do siebie domów.<br />Klasy możecie Tworzyć samodzielnie, mogą one zawierać zdefiniowane wartości i metody lub wykorzystywać wartości przekazane przez użytkownika.<br />Podsumowując &#8211; za pomocą jednej klasy możemy utworzyć wiele obiektów, czyli instancji naszej klasy, które będą niezależne od siebie.<br /><br />Należy zapamiętać, że dobrą praktyką jest tworzenie nowej klasy w oddzielnym pliku.</p>
<h3>Przykład:</h3>
<p>Stwórzmy nowy plik/klasę o nazwie Person ustawimy w niej, że nasze obiekty będą miały imię i wiek:</p>
<p><strong>plik Person.java</strong></p>
<pre>public class Person1 {<br />    String name;<br />    int age;<br />}</pre>
<p><strong>plik ObjectsAndClasses .java</strong></p>
<pre>public class ObjectsAndClasses {<br />    public static void main(String[] args) {<br /><br />        //tworzymy nową osobę<br />        Person osoba1 = new Person();<br />        osoba1.name = "Jan"; //ustawiamy imię<br />        osoba1.age = 18; //ustawiamy wiek<br /><br />        //tworzymy jeszcze jedną osobę<br />        Person osoba2 = new Person();<br />        osoba2.name = "Anna"; //ustawiamy imię<br />        osoba2.age = 22; //ustawiamy wiek<br /><br />        System.out.println(osoba1.name + " ma " + osoba1.age + " lat.");<br />        System.out.println(osoba2.name + " ma " + osoba2.age + " lat.");<br />    }<br />}</pre>
<p> </p>
<h3>Przykład:</h3>
<p>Stworzymy nowy obiekt wykorzystując klasę JFrame (należy zaimportować javax.swing.* na samej górze skryptu), dzięki której wywołamy okienko systemowe, czyli utworzymy instancję klasy.</p>
<pre>public class UsingObjects {<br />    public static void main(String[] args) {<br /><br />        JFrame window = new JFrame();<br />        //podajemy nazwę typu/klasy + wymyślona nazwa = słówko "new" i nazwa klasy + ()<br /><br />        //teraz nadamy rozmiar okienka<br />        //po wpisaniu nazwy zmiennej i postawieniu "." pokaże nam się lista dostępnych opcji<br />        window.setSize(600,600);<br /><br />        //ustawimy tytuł<br />        window.setTitle("Moje pierwsze okienko");<br /><br />        window.setVisible(true); // ustawiamy widoczność okienka na true<br />        //po uruchomieniu programu pokaże się małe okienko systemowe</pre>
<p> </p>
<h2>Metody</h2>
<p>Klasa może definiować metody, czyli nic innego jak funkcje z podejścia proceduralnego. Kiedy tworzymy obiekt nadajemy mu dostęp do metod danej klasy.</p>
<p>Możemy rozszerzyć powyższy przykład z osobą lub utworzyć nową klasę:</p>
<p>plik Person2.java:</p>
<pre>import java.util.*; //import do metody określającej rok urodzenia<br /><br />public class Person2 {<br />    String name;<br />    int age;<br /><br />    //w Java istnieją tzw. gettery i settery, czyli metody pobierające lub ustawiające wartość, co do ich stosowania zdania są podzielone;<br />    //możemy zaimplementować je w Intellij automatycznie lub napisać samodzielnie<br />    //automatycznie: PPM -&gt; Generate... (u mnie skrót Alt+G) -&gt; Getter and Setter...<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name; //słówko this pozwala dostać się do pola w obiekcie, nie musimy go używać jeżeli nazwy argumentów i zmiennych się różnią<br />    }<br /><br />    public int getAge() {<br />        return age;<br />    }<br /><br />    public void setAge(int age) {<br />        this.age = age;<br />    }<br /><br /><br /><br />    //METODY<br />    //ustawimy metodę, która wygeneruje powitanie<br />    public void sayHello(){<br />        System.out.println("Hello new Person! " + name);<br />    }<br /><br />    //stworzymy metodę określającą rok urodzenia<br />    public void birthYear(){<br />        Calendar data = Calendar.getInstance();<br />        int by = data.get(Calendar.YEAR) - age;<br />        System.out.println("Rok urodzenia to:" + by);<br />        /*<br />        musimy zwrócić uwagę na to, że tak skonstruowana metoda nic nam nie zwraca.<br />        To oznacza, że nie otrzymamy fizycznie wartości, którą możemy wykorzystać gdzieś indziej, otrzymamy jedynie wyświetlony napis. Jeżeli chcemy uzyskać wartość musimy ją zwrócić używając słówka return.<br />         */<br />    }<br /><br />    public int yearsToRetirement(){<br />        return 65 - age;<br />    }<br /><br />    /*<br />    Pamiętamy z tematu JAVA – instrukcje sterujące, pętle i funkcje(metody), że metody mogą przyjmować argumenty. Czyli możemy przekazać bezpośrednio wartość przy wywołaniu metody<br />     */<br />    public void speak(String text){<br />        System.out.println(text);<br />    }<br /><br />    public void move(String direction, double distance){<br />        System.out.println("Hurra, poszedłem " + direction + ", " + distance + " metrów");<br />    }<br /><br />    //przeładujemy metodę<br />    public void speak(String text, int words){<br />        System.out.println(text + words + " wyrazy");<br />    }<br />}<br /><br /></pre>
<p><strong>plik Methods.java</strong></p>
<pre>package tutaj.nazwa.waszego.pakietu;<br /><br />public class Methods {<br />    public static void main(String[] args) {<br />        /*<br />        Klasa może definiować metody, czyli nic innego jak funkcje z podejścia proceduralnego. Kiedy tworzymy obiekt nadajemy mu dostęp do metod danej klasy.<br />         */<br />        Person2 osoba2_1 = new Person2();<br /><br />        /* tak ustawiamy dane bez getterów i setterów*/<br />        osoba2_1.name = "Ania"; //ustawiamy imię<br />        osoba2_1.age = 10; //ustawiamy wiek<br />        osoba2_1.sayHello(); //wyświetli: Hello new Person! Ania<br />        System.out.println(osoba2_1.name + " ma " + osoba2_1.age + " lat."); //wyświetli: Ania ma 10 lat.<br /><br />        //wykorzystanie getterów i setterów do ustawiania wartości danych<br />        Person2 osoba2_2 = new Person2();<br /><br />        osoba2_2.setName("Jan");<br />        osoba2_2.setAge(18);<br />        osoba2_2.sayHello(); //wyświetli: Hello new Person! Jan<br />        System.out.println(osoba2_2.getName() + " ma " + osoba2_2.getAge() + " lat."); //wyświetli: Jan ma 18 lat.<br /><br /><br />        //wywołujemy metodę sprawdzającą rok urodzenia<br />        //ona tylko wyświetla napis<br />        if (osoba2_1.age &gt; 0) osoba2_1.birthYear();<br /><br />        //wywołujemy metodę zwracającą lata do emerytury<br />        int yl = osoba2_1.yearsToRetirement();<br />        System.out.println("Do emerytury pozostało: " + yl + " lat");<br /><br />        //wywołujemy metodę z 1 argumentem<br />        osoba2_1.speak("Cześć, nauczyłem się mówić :)");<br /><br />        //wywołujemy metodę z 2 argumentami<br />        osoba2_1.move("prosto", 5);<br /><br />        //wywołujemy przeładowaną metodę<br />        osoba2_1.speak("Wypowiedziałam dzisiaj ", 2);<br /><br />        //argumenty do metody mogą być przekazywane przez zmienne<br />        String hello = "Hello everybody";<br />        osoba2_1.speak(hello);<br /><br />    }<br />}</pre>
<p> </p>
<h2>Konstruktory</h2>
<p>Konstruktory, to metody wywoływane automatycznie w momencie tworzenia obiektu i nie wymagają dodatkowych akcji. Metody te występują tylko w kontekście klas, a ich nazwy są takie same jak nazwa klasy głównej.<br /><br />Dzięki konstruktorowi możemy przesłać określone wartości do obiektu w momencie jego tworzenia.</p>
<p> </p>
<p><strong>plik Person3.java</strong></p>
<pre>public class Person3 {<br />    String name;<br />    int age;<br /><br />    //tworzymy konstruktor bezargumentowy<br />    public Person3() {<br />        System.out.println("Obiekt klasy Person3 storzony - to ja, konstruktor bezargumentowy");<br />    }<br /><br />    //konstruktor przyjmujący 1 argumant: imię lub wiek<br />    public Person3(String name) {<br />        this.name = name; //aby zmodyfikować konkretną zmienną w obiekcie możemy użyć słówka "this", ale tylko w sytuacji kiedy argument i zmienna mają takie same nazwy<br />    }<br /><br />    //konstruktor przyjmujący 2 argumenty<br />    public Person3(String name, int age) {<br />        this.name = name;<br />        this.age = age;<br />    }<br />    /*<br />    możemy wewnątrz konstruktora wywołać inny konstruktor<br />    nie używamy wywołania np: Person("Ania",13), tylko zamiast nazwy konstruktora używamy "this"<br />    np: this("Ania",13)<br />     */<br />}</pre>
<p><strong>plik Constructors.java</strong></p>
<pre>public class Constructors {<br />    public static void main(String[] args) {<br /><br />        //tworzymy obiekt klasy Person3<br />        Person3 osoba3_1 = new Person3();<br />        /*<br />        wywoła się konstruktor bezargumentowy, bo w nawiasie nie podaliśmy danych<br />        po uruchomieniu skryptu otrzymamy napis:<br />        Obiekt klasy Person3 stworzony - to ja, konstruktor bezargumentowy<br />        został wywołany konstruktor w momencie tworzenia obiektu<br />        */<br /><br />        /*<br />        możemy tworzyć wiele konstruktorów, rozróżniając je ilością przekazywanych argumentów<br />        */<br /><br />        //tworzymy obiekt przekazując 1 argument - uruchomi się konstruktor z 1 argumentem<br />        Person3 osoba3_2 = new Person3("Kama");<br />        System.out.println("Przypisano imię " + osoba3_2.name);<br /><br />        //tworzymy obiekt przekazując 2 argumenty - uruchomi się konstruktor z 2 argumentami<br />        Person3 osoba3_3 = new Person3("Anna", 22);<br />        System.out.println("Przypisano imię " + osoba3_3.name + " oraz wiek = " + osoba3_3.age);<br />    }<br />}</pre>
<p> </p>
<h2>Modyfikatory dostępu</h2>
<p>Do tej pory wykonywaliśmy przykłady w oparciu o publiczną dostępność danego elementu, czyli public.<br />Taka metoda lub właściwość jest publiczna, więc widoczna wszędzie wewnątrz obiektu i poza nim.<br />Dostęp do pola jest nieograniczony i można je odczytywać i zmieniać dowolnie.<br /><br />Właściwość lub metoda może być prywatna, czyli private, wówczas może zostać użyta tylko wewnątrz obiektu.<br /><br />Właściwość lub metoda protected może być użyta tylko wewnątrz obiektu, package, ale może być również dziedziczona.<br /><br />Metoda domyślna &#8211; może być dostępna tylko wewnątrz tego package<br /><br />Zaleca się w programowaniu i w życiu, nie udostępniać zbyt wiele informacji na zewnątrz, więc tego się trzymajmy – korzystamy z modyfikatorów private.<br /><br />Kolejność restrykcji:<br />&#8211; private<br />&#8211; default<br />&#8211; protected<br />&#8211; public<br /><br />np.<br />public void doSomethingPublic(){}<br />private void doSomethingPrivate(){}<br />protected void doSomethingProtected(){}<br />void doSomething(){}<br /><br />I tutaj pojawia się pojęcie <span style="text-decoration: underline;"><strong>enkapsulacji</strong></span>, czyli hermetyzacji, która polega na zgrupowaniu danych i metod w obrębie jednej jednostki np. klasy.<br />Enkapsulacja pozwala również na ograniczenie dostepu do danych.</p>
<p><strong>plik AccessModifiers.java</strong></p>
<pre>public class AccessModifiers {<br />    public static void main(String[] args) {<br />        //ustawiamy prywatne zmienne za pomocą setterów<br />        Frog frog1 = new Frog();<br />        frog1.setName("Bella");<br />        frog1.setAge(2);<br />        System.out.println("Żabcia " + frog1.getName() + " ma lat " + frog1.getAge());<br />    }<br />}</pre>
<p><strong>plik Frog.java</strong></p>
<pre>public class Frog {<br />    private String name;<br />    private int age;<br /><br />    //jeżeli modyfikatory zmiennych będą private, nie będziemy mogli ich zmienić poza klasą,<br />    //jedyne co możemy zrobić to skorzystać z setterów<br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    public void setAge(int age) {<br />        this.age = age;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public int getAge() {<br />        return age;<br />    }<br />}</pre>
<p> </p>
<h2>Static i Final</h2>
<p>Czasami istnieje potrzeba stworzenia zmiennej lub metody statycznej, czyli takiej, która nie jest przypisana do obiektu, a jedynie do klasy i może być wykorzystywana poza klasą.</p>
<p>Metody i właściwości statyczne to takie, które nie wymagają utworzenia obiektu, aby móc się do nich odwołać. Nadawane są dla całej klasy. Tworzymy je przy pomocy modyfikatora static.</p>
<p><strong>plik Static_Final.java</strong></p>
<pre>public class Static_Final {<br />    public static void main(String[] args) {<br /><br />        Thing something = new Thing();<br />        something.name = "Itit";<br />        something.showName();<br /><br />        //teraz wykorzystamy static<br />        Thing.saluton = "Jestem statycznym powitaniem niezależnym od obiektów";<br />        Thing.showInfo();<br />        /*<br />        zwróćmy uwagę, że nie tworzymy nowego obiektu, ani nie odwołujemy się do metody, czy zmiennej przez obiekt.<br />        Podajemy nazwę klasy i po krropce wywołujemy wartości statyczne.<br />         */<br /><br />        something.showNameSaluton();<br /><br />        //STAŁE<br />        System.out.println(Thing.LUCK_NR); //ta wartość jest niezmienna<br /><br />        //działanie statycznego licznika przedstawiam tutaj na dole, jednak należy pamiętać, że już 1 obiekt został stworzony wcześniej<br />        System.out.println("Stan licznika przed utworzeniem dodatkowych obiektów " + Thing.count);<br /><br />        Thing something1 = new Thing();<br />        Thing something2 = new Thing();<br />        Thing something3 = new Thing();<br />        System.out.println("Stan licznika po utworzeniu dodatkowych obiektów " + Thing.count);<br /><br /><br />    }<br />}</pre>
<p><strong>plik Thing.java</strong></p>
<pre>public class Thing {<br />    public String name; //publiczna zmienna<br />    public static String saluton; //statyczna zmienna<br /><br />    public void showName(){<br />        System.out.println(name);<br />    }<br /><br />    public void showNameSaluton(){<br />        System.out.println(saluton + " - " + name);<br />    }<br /><br />    public static void showInfo() {<br />        System.out.println(saluton);<br />        //System.out.println(name); takie odwołanie wygenerujee błąd, pamiętajmy, że to jest stałe w klasie, a obiekty przyjmują inne wartości<br />    }<br />    /*<br />     we wcześniejszych lekcjach korzystaliśmy ze stałych wbudowanych, np. liczby Pi z biblioteki Math<br />    stałą możemy stworzyć sami, wystarczy użyć słówka "final"<br />    Stała to właściwość klasy tylko do odczytu. Jak wiemy, stałe deklarujemy drukowanymi literami, są dostępne public i nie można ich modyfikować w kodzie.<br />    */<br />    public final static int LUCK_NR = 7;<br /><br /><br />    /*<br />    o ile idea istnienia stałych nikogo nie dziwi o tyle właściwości i metody statyczne już tak. Bo po co? A na przykład dla licznika utworzonych obiektów<br />     */<br />    //tworzę konstruktor, który za każdym razem, gdy zostanie utworzony nowy obiekt tej klasy doda 1 do licznika<br />    public static int count = 0;<br />    //teraz konstruktor,<br />    public Thing(){<br />        /*<br />        możemy stan licznika przy każdym obiekcie dodać do zmiennej i będziemy mieli np. id konkretnego obiektu<br />         */<br />        count++;<br />    }<br />}</pre>
<p> </p>
<h2>Dziedziczenie</h2>
<p>Inheritance, czyli dziedziczenie. Tak jak w życiu – jako potomkowie dziedziczymy po naszych przodkach pewne cechy (tak naprawdę to 50% od matki i 50% od ojca), tak samo klasy dziedziczą pola i metody, ale mogą zostać uzupełnione o inne elementy, których przodek nie posiada.<br /><br />Jeżeli klasa przodka posiada pola i metody, które nie są prywatne lub są chronione, to klasa potomna również będzie je posiadać. Aby klasa dziedziczyła po innej należy użyć słówka extends i podać nazwę klasy przodka:</p>
<pre>public class Car extends Machine{}</pre>
<p><br />Klasa może dziedziczyć tylko po jednej klasie (rozszerzać tylko jedną klasę bazową ).</p>
<p><strong>plik Machine.java</strong></p>
<pre>public class Machine {<br />    protected String type;<br /><br />    Machine(){<br />        System.out.println("Wywołanie konstruktora z klasy nadrzędnej");<br />    }<br /><br />    public void start(){<br />        System.out.println("Maschine started.");<br />    }<br />    public void stop(){<br />        System.out.println("Maschine stopped.");<br />    }<br />}</pre>
<p><strong>plik Car.java</strong></p>
<pre>/*<br />chcemy aby nasza klasa dziedziczyła wszystko po klasie Maschine<br />należy użyc słówka "extends"<br /> */<br />public class Car extends Machine{<br />    public void turn(){<br />        System.out.println("Car turned.");<br />    }<br />    //możemy nadpisać klasę dziedziczoną w klasie potomnej<br />    public void stop(){<br />        System.out.println("Car stopped.");<br />    }<br />    /*<br />    metody możemy nadpisywać automatycznie klikając (u mnie) Ctrl+o lub ALT+g lub wybierając z menu Code i "override methods"<br /><br />    @Override<br />    public void start() {<br />        super.start(); //tą część możemy wykasować i podmienić na swoją wersję<br />    }<br />    */<br /><br />    //możemy wywołać konstruktor z klasy nadrzędnej<br />    Car(){<br />        super();<br />    }<br />}</pre>
<p><strong>plik Inheritance.java</strong></p>
<pre>public class Inheritance {<br />    public static void main(String[] args) {<br /><br />        Machine machine1 = new Machine();<br />        machine1.start();<br />        machine1.stop();<br /><br />        Car car1 = new Car(); //tutaj zostanie wywołany konstruktor z klasy nadrzędnej<br />        car1.start(); //dostęp do odziedziczonej metody<br />        car1.turn(); //nowa metoda, tylko dla klasy Car, Maschine nie ma tej funkcjonalności<br />        car1.stop();//dostęp do odziedziczonej metody<br /><br />        /*<br />        jeżeli nie chcemy, aby stworzona klasa była dziedziczona na początku wpisujemy "final", np. final class Example<br />         */<br /><br />        //jeżeli zajdzie potrzeba sprawdzenia jakiej klasy instancją jest dany obiekt - oto rozwiązanie<br />        System.out.println(car1 instanceof Car); //true<br />        System.out.println(machine1 instanceof Car); //false<br />    }<br />}</pre>
<p> </p>
<h3>Przykład:</h3>
<p><strong>plik App.java</strong></p>
<pre>public class App {<br />    public static void main(String[] args) {<br />        Car auto = new Car(270.0f);<br />        auto.Info();<br />    }<br />}</pre>
<p><strong>plik Car.java</strong></p>
<pre>public class Car extends Vehicle{<br />    public Car(float topSpeed) {<br />        //wywołujemy konstruktor klasy nadrzędnej<br />        super("Auto", topSpeed);<br />    }<br />}</pre>
<p><strong>plik Vehicle.java</strong></p>
<pre>public class Vehicle {<br />    protected String type;<br />    protected float topSpeed;<br /><br />    public Vehicle(){<br />        type = "basic";<br />    }<br /><br />    public Vehicle(String type, float topSpeed) {<br />        this.type = type;<br />        this.topSpeed = topSpeed;<br />    }<br /><br />    protected void Info(){<br />        System.out.println("Typ pojazdu " + this.type + ", max szybkość " + this.topSpeed);<br />    }<br />}</pre>
<h3>Przykład:</h3>
<p><strong>plik App.java</strong></p>
<pre>public class App {<br />    public static void main(String[] args) {<br />        School t = new School(3, 316, "Technikum");<br />    }<br />}</pre>
<p><strong>plik Building.java</strong></p>
<pre>public class Building {<br />    public int numFloors;<br />    public int numClass;<br /><br />    public Building(){<br />        numFloors = 3;<br />    }<br /><br />    public Building(int numFloors, int numClass) {<br />        this.numFloors = numFloors;<br />        this.numClass = numClass;<br />        System.out.println("Budynek ma " + numFloors + " pięter oraz " + numClass + " sal lekcyjnych.");<br />    }<br />}</pre>
<p><strong>plik School.java</strong></p>
<pre>public class School extends Building{<br />    public String type = "Technikum";<br /><br />    public School(int numFloors, int numClass, String type) {<br />        super(numFloors, numClass);<br />        System.out.println("Szkoła ma " + numFloors + " pięter " + numClass + " klas i jest to " + type);<br />    }<br />}</pre>
<p> </p>
<h2>Polimorfizm</h2>
<p>Polimorfizm to możliwość przybierania różnych form w zależności od wyboru podklasy.<br />Każdy obiekt klasy dziedziczącej jest tez obiektem klasy nadrzędnej.</p>
<p><strong>plik Polymorphism.java</strong></p>
<pre>public class Polymorphism {<br />    public static void main(String[] args) {<br />        /*<br />        Polimorfizm to możliwość przybierania różnych form w zależności od wyboru podklasy<br />        Każdy obiekt klasy dziedziczącej jest tez obiektem klasy nadrzędnej.<br />         */<br /><br />        Vehicle newCar = new Car("Auto");//nie ma dostępu do maxSpeed<br />        System.out.println(newCar.name);<br /><br />        Vehicle newBicycle = new Bicycle("Rower"); //ma dostęp tylko do name<br />        System.out.println(newBicycle.name);<br /><br />        //poniższy zapis jest nieprawidłowy<br />        //Car test = new Vehicle("test");<br /><br />        //tłumacząc prościej - każde auto jest pojazdem, ale nie każdy pojaz jest autem<br />    }<br />}</pre>
<p><strong>plik Vehicle.java</strong></p>
<pre>public class Vehicle {<br />    public String name;<br /><br />    public Vehicle(String name) {<br />        this.name = name;<br />    }<br />}</pre>
<p><strong>plik Car.java</strong></p>
<pre>public class Car extends Vehicle{<br />    public int maxSpeed;<br /><br />    public Car(String name) {<br />        super(name);<br />    }<br />}</pre>
<p><strong>plik Bicycle.java</strong></p>
<pre>public class Bicycle extends Car{<br />    int numWheels;<br />    public Bicycle(String name){<br />        super(name);<br />    }<br />}</pre>
<p> </p>
<h3>Przykład:</h3>
<p><strong>plik Company.java</strong></p>
<pre>public class Company {<br />    public static void main(String[] args) {<br />        Employee employee = new Employee("Kama", "Programmer", 10000);<br />        Manager manager = new Manager("Jan", "Team Leader", 11000, "R&amp;D");<br />        Ceo ceo = new Ceo("Rafał", "Prezes", 20000, "Board", 100);<br /><br />        Employee worker = ceo; //każdy ceo jest employee i ma dostęp do metod i własności tej klasy<br />        worker.doWork();<br />        Manager person = ceo;<br />        //wpisując nazwę obiektu po kropce możemy zobaczyć dostęp do metod i właściwości<br />    }<br />}</pre>
<p><strong>plik Employee.java</strong></p>
<pre>public class Employee {<br />    private String name;<br />    private String jobTitle;<br />    private int salary;<br /><br />    public Employee(){<br />        name = "unknown";<br />        jobTitle = "unknown";<br />        salary = 2500;<br />    }<br /><br />    public Employee(String name, String jobTitle, int salary) {<br />        this.name = name;<br />        this.jobTitle = jobTitle;<br />        this.salary = salary;<br />    }<br /><br />    public void doWork(){<br />        System.out.println("Working!");<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    public String getJobTitle() {<br />        return jobTitle;<br />    }<br /><br />    public void setJobTitle(String jobTitle) {<br />        this.jobTitle = jobTitle;<br />    }<br /><br />    public int getSalary() {<br />        return salary;<br />    }<br /><br />    public void setSalary(int salary) {<br />        this.salary = salary;<br />    }<br />}</pre>
<p><strong>plik Manager.java</strong></p>
<pre>public class Manager extends Employee{<br />    private String departmentName;<br /><br />    public Manager() {<br />        super();<br />        departmentName = "unknown";<br />    }<br /><br />    public Manager(String name, String jobTitle, int salary, String departmentName) {<br />        super(name, jobTitle, salary);<br />        this.departmentName = departmentName;<br />    }<br /><br />    public void hireEmployee(){<br />        System.out.println("Employee hired!");<br />    }<br />    public void giveRise(Employee employee){<br />        System.out.println("Employee got rise!");<br />    }<br /><br />    public String getDepartmentName() {<br />        return departmentName;<br />    }<br /><br />    public void setDepartmentName(String departmentName) {<br />        this.departmentName = departmentName;<br />    }<br />}</pre>
<p><strong>plik Ceo.java</strong></p>
<pre>public class Ceo extends Manager{<br />    private int sharesNumber;<br /><br />    public Ceo() {<br />        sharesNumber = 100;<br />    }<br /><br />    public Ceo(String name, String jobTitle, int salary, String departmentName, int sharesNumber) {<br />        super(name, jobTitle, salary, departmentName);<br />        this.sharesNumber = sharesNumber;<br />    }<br /><br />    public void signContract(){<br />        System.out.println("Contract signed!");<br />    }<br /><br />    public int getSharesNumber() {<br />        return sharesNumber;<br />    }<br /><br />    public void setSharesNumber(int sharesNumber) {<br />        this.sharesNumber = sharesNumber;<br />    }<br />}</pre>
<p> </p>
<h3>Przykład:</h3>
<p><strong>plik PolymorphismCasting.java</strong></p>
<pre>public class PolymorphismCasting {<br />    public static void main(String[] args) {<br />        Employee employee[] = new Employee[10];<br />        employee[0] = new Manager("Dyrektor", 10000); //typ Manager<br />        employee[0].printName();<br />        employee[1] = new Employee("Programista", 12000);<br />        employee[1].printName();<br /><br />        /*<br />        w takiej sytuacji jeżeli chcemy, aby dyrektor mógł dać podwyżkę to musimy<br />        rzutowac jego typ na Managera, bo typ employee nie posiada takiej metody<br />         */<br /><br />        Manager manager = (Manager) employee[0];<br />        manager.giveRise(employee[1], 0.15f);<br />        employee[1].printName();<br />    }<br />}</pre>
<p><strong>plik Employee.java</strong></p>
<pre>public class Employee {<br />    protected int salary;<br />    protected String name;<br />    public Employee(String name, int salary){<br />        this.name = name;<br />        this.salary = salary;<br />    }<br />    public void printName(){<br />        System.out.println("Employee: " + name + ", salary: " + salary);<br />    }<br />}</pre>
<p><strong>plik Manager.java</strong></p>
<pre>public class Manager extends Employee{<br />    public Manager(String name, int salary) {<br />        super(name, salary);<br />    }<br />    public void printName(){<br />        System.out.println("Manager: " + name + ", salary: " + salary);<br />    }<br />    public void giveRise(Employee e, float percent){<br />        e.salary+=(int)(e.salary*percent);<br />    }<br />}</pre>
<p> </p>
<h2>Klasy i metody abstrakcyjne oraz interfejsy</h2>
<p>Klasa abstrakcyjna definiuje pewien model i zachowanie obiektu.<br />Taka klasa nie posiada definicji tych metod, jedynie ich deklaracje, że gdzieś dalej w kodzie muszą się pojawić. Czyli do czasu rozszerzenia ich o funkcjonalności w klasach dziedziczących, te metody nie istnieją (są abstrakcją).<br />Metody abstrakcyjne definiujemy w klasie bazowej klauzulą abstract. Wszystkie tego typu zadeklarowane metody będą musiały pojawić się w klasach dziedziczących.<br />Nie można utworzyć obiektu klasy abstrakcyjnej. Klasa ta jest jedynie „bazą” dla klas potomnych.<br />Można przypisać podklasę do zmiennej typu abstrakcyjnego.<br />Pamiętamy, że klasę dziedziczymy i możemy zrobić to tylko raz.</p>
<p> </p>
<p>Interfejs jest zbiorem metod jakie wymagamy by posiadała klasa, która go implementuje.<br />Możemy implementować wiele interfejsów dla jednej klasy.<br />Wszystkie metody określane w interfejsie są abstrakcyjne.</p>
<h3>Przykład:</h3>
<p><strong>plik AbstractClassesAndInterfaces.java</strong></p>
<pre>public class AbstractClassesAndInterfaces {<br />    public static void main(String[] args) {<br /><br />        //CelestialBody earth = new CelestialBody();<br />        //powyższe wywołanie generuje błąd, bo nie ma czegoś fizycznego co się nazywa ciało niebieskie. To tylko pojęcie określające różne elementy<br />        Planet earth = new Planet();<br />        earth.setName("Ziemia");<br />        System.out.println(earth.getName());<br />        earth.round();<br /><br />        Star sun = new Star();<br />        sun.round();<br /><br />        earth.showInfo();<br />    }<br />}</pre>
<p><strong>plik CelestialBody.java</strong></p>
<pre>public abstract class CelestialBody {<br />    private String name;<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    //tworzymy nazwę metody, którą musi mieć każda klasa dziedzicząca metodę abstrakcyjną<br />    public abstract void round();<br /><br /><br />}</pre>
<p><strong>plik Info.java</strong></p>
<pre>public interface Info {<br />    public void showInfo();<br />}</pre>
<p><strong>plik Planet.java</strong></p>
<pre>public class Planet extends CelestialBody implements Info {<br />    @Override<br />    public void round() {<br />        System.out.println("jestem planetą - kręce się");<br />    }<br /><br />    @Override<br />    public void showInfo() {<br />        System.out.println("Implementuję metodę wspólną dla obu klas");<br />    }<br />}</pre>
<p><strong>plik Star.java</strong></p>
<pre>public class Star extends CelestialBody implements Info {<br /><br />    @Override<br />    public void round() {<br />        System.out.println("Jestem gwiazdą - nie kręcę się");<br />    }<br /><br />    @Override<br />    public void showInfo() {<br />        System.out.println("Implementuję metodę wspólną dla obu klas");<br />    }<br />}</pre>
<p> </p>
<h3>Różnice między interfejsem, a klasą abstrakcyjną</h3>
<ul>
<li>klasa może implementować wiele interfejsów, ale rozszerzać tylko jednego rodzica</li>
<li>metody w interfejsie są publiczne, w klasie publiczne lub chronione</li>
<li>interfejs może zawierać tylko deklaracje metod, a klasa też metody zdefiniowane</li>
<li>klasy abstrakcyjne mogą zawierać atrybuty(pola), interfejsy nie</li>
<li>w interfejsach wszystkie metody są abstrakcyjne, natomiast w klasie abstrakcyjnej można stworzyć metody posiadające ciało, jak i abstrakcyjne</li>
<li>klasa abstrakcyjna zazwyczaj jest ściśle związana z klasami dziedziczącymi w sensie logicznym, czyli np. tworzymy klasę abstrakcyjną Planeta po której dziedziczą konkretne klasy planet (np. Ziemia, Mars).</li>
<li>Interfejs natomiast nie musi być już tak mocno związany z daną klasą, on określa jej cechy, np możesz stworzyć interfejs Zniszczalny, który mówi że dany obiekt może zostać zniszczony. Taki interfejs możesz nadać zarówno klasą Planeta, Gwiazda, Budynek itp.</li>
<li>interfejs może dziedziczyć jedynie po innych interfejsach, a klasa abstrakcyjna może dziedziczyć po klasach abstrakcyjnych, interfejsach a nawet zwykłych klasach</li>
<li>interfejs nie może mieć konstruktora, w klasie abstrakcyjnej możemy dostarczyć implementację konstruktora domyślnego</li>
</ul>
<p> </p>
<h3>Przykład:</h3>
<p><strong>plik Interface.java</strong></p>
<pre>public class Interface {<br />    public static void main(String[] args) {<br />        Car car = new Car();<br />        car.move();<br /><br />        // możemy zapimplementować obiekt tak:<br />        // Vehicle vehicle = new Car();<br />        //lub tak:<br />        Vehicle vehicle = car;<br />        System.out.println(vehicle.speed());<br /><br />        Vehicle car2 = new Car();<br />        car2.turn();<br /><br />        Car car3 = (Car) car2; //rzutowanie<br />        car3.stop();<br /><br />        Train train = new Train();<br />        Vehicle trainVehicle = train;<br />        System.out.println(trainVehicle.speed());<br /><br />        Plain plain = new Plain();<br />        plain.increaseHeight();<br /><br />        Vehicle vehicles[] = new Vehicle[4];<br />        vehicles[0] = car;<br />        vehicles[1] = car2;<br />        vehicles[2] = train;<br />        vehicles[3] = plain;<br /><br />        vehicles[2].move();<br /><br />        if (vehicles[2] instanceof Train){<br />            Train someTrain = (Train) vehicles[2];<br />            someTrain.turn();<br />        }<br /><br />        if (vehicles[3] instanceof Plain){<br />            Plain somePlain = (Plain) vehicles[3];<br />            somePlain.decreaseHeight();<br /><br />            Flying flyingVehicle = somePlain;<br />            flyingVehicle.increaseHeight();<br />        }<br />    }<br />}</pre>
<p><strong>plik Flying.java</strong></p>
<pre>public interface Flying {<br />    void increaseHeight();<br />    void decreaseHeight();<br />}</pre>
<p><strong>plik Vehicle.java</strong></p>
<pre>public interface Vehicle {<br />    void move(); // nie musimu podawać modyfikatora public<br />    void stop();<br />    void turn();<br />    float speed();<br />}</pre>
<p><strong>plik Car.java</strong></p>
<pre>public class Car implements Vehicle{<br />    @Override<br />    public void move() {<br />        System.out.println("Car is moving!");<br />    }<br /><br />    @Override<br />    public void stop() {<br />        System.out.println("Car stopped!");<br />    }<br /><br />    @Override<br />    public void turn() {<br />        System.out.println("Car is turning!");<br />    }<br /><br />    @Override<br />    public float speed() {<br />        return 220;<br />    }<br />}</pre>
<p><strong>plik Plain.java</strong></p>
<pre>//wiele interfejsów<br />public class Plain implements Vehicle, Flying{<br />    @Override<br />    public void move() {<br />        System.out.println("Plain is moving!");<br />    }<br /><br />    @Override<br />    public void stop() {<br />        System.out.println("Plain stopped!");<br />    }<br /><br />    @Override<br />    public void turn() {<br />        System.out.println("Plain turn!");<br />    }<br /><br />    @Override<br />    public float speed() {<br />        return 900;<br />    }<br /><br />    //implementujemy metody z obu interfejsów<br /><br />    @Override<br />    public void increaseHeight() {<br />        System.out.println("Plain up!");<br />    }<br /><br />    @Override<br />    public void decreaseHeight() {<br />        System.out.println("Plain down!");<br />    }<br />}</pre>
<p><strong>plik Train.java</strong></p>
<pre>public class Train implements Vehicle{<br />    @Override<br />    public void move() {<br />        System.out.println("Train is moving!");<br />    }<br /><br />    @Override<br />    public void stop() {<br />        System.out.println("Train stopped!");<br />    }<br /><br />    @Override<br />    public void turn() {<br />        System.out.println("Train turn!");<br />    }<br /><br />    @Override<br />    public float speed() {<br />        return 180;<br />    }<br />}</pre>
<p> </p>
<h3>Przykład:</h3>
<p><strong>plik interface_extends_default_static_final.java</strong></p>
<pre>public class Train implements Vehicle{<br />    @Override<br />    public void move() {<br />        System.out.println("Train is moving!");<br />    }<br /><br />    @Override<br />    public void stop() {<br />        System.out.println("Train stopped!");<br />    }<br /><br />    @Override<br />    public void turn() {<br />        System.out.println("Train turn!");<br />    }<br /><br />    @Override<br />    public float speed() {<br />        return 180;<br />    }<br />}</pre>
<p><strong>plik Animal.java</strong></p>
<pre>public interface Animal {<br />    int getNumLegs();<br />    String getName();<br />}</pre>
<p><strong>plik Bird.java</strong></p>
<pre>//rozszerzamy wiele interfejsów<br />public interface Bird extends Animal,Eating,Flying{<br /><br />}</pre>
<p><strong>plik Eating.java</strong></p>
<pre>public interface Eating {<br />    void eat();<br />    default void searchForFood(){<br />        System.out.println("Searching for food.");<br />    }<br />}</pre>
<p><strong>plik Flying.java</strong></p>
<pre>public interface Flying {<br />    //możemy dodać zmienną statyczną<br />    static final float DEFAULT_WINGSPAN = 0.7f;<br />    void fly();<br /><br />    default void flyHigher(){<br />        System.out.println("Flying higher.");<br />    }<br /><br />    default float getWingspan(){<br />        return Flying.DEFAULT_WINGSPAN;<br />    }<br /><br />    static int getDefaultNumWings(){<br />        return 2;<br />    }<br />}</pre>
<p><strong>plik Parrot.java</strong></p>
<pre>public class Parrot implements Bird{<br />    @Override<br />    public int getNumLegs() {<br />        return 2;<br />    }<br /><br />    @Override<br />    public String getName() {<br />        return "Parrot";<br />    }<br /><br />    @Override<br />    public void eat() {<br />        System.out.println("Eating.");<br />    }<br /><br />    @Override<br />    public void fly() {<br />        System.out.println("Parrot is flying.");<br />    }<br /><br />    //możemy nadpisac metodę domyslną, jeżeli np nam się nie podoba<br /><br />    @Override<br />    public void searchForFood() {<br />        System.out.println("Parrot is searching for food.");<br />    }<br />}</pre>
<p> </p>
<h3>Przykład:</h3>
<p><strong>plik MouseListenerExample.java</strong></p>
<pre>import javax.swing.*;<br /><br />public class MouseListenerExample {<br />    public static void main(String[] args) {<br />        Frame frame = new Frame();<br />        frame.setSize(300,300); //wielkość okienka<br />        frame.setTitle("Przykład"); //tytuł okienka<br />        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//co ma zrobić aplikacja jeżeli użytkownik będzie chciał ją zamknąć<br />        frame.setLayout(null);//wymuszamy położenie na taką pozycję jak my ustawiliśmy<br />        frame.setVisible(true);//pokazujemy okienko<br />        frame.addMouseListener(frame);<br />    }<br />}</pre>
<p><strong>plik Frame.java</strong></p>
<pre>//korzystamy z wbudowanej klasy JFrame oraz wbudowanego interfejsu MouseListener<br />import javax.swing.*;<br />import java.awt.event.MouseEvent;<br />import java.awt.event.MouseListener;<br /><br />public class Frame extends JFrame implements MouseListener {<br /><br />    //jeżeli nie chcemy uzyskiwać wyników kliknięć w konsoli, tylko w okienku musimy dodać JLable<br />    private JLabel label;<br />    public Frame(){<br />        label = new JLabel("---");<br />        label.setBounds(10,10,250,50);//określamy wielkość pola<br />        this.add(label);<br />    }<br /><br />    //alt+g i implementujemy wszystkie metody<br />    @Override<br />    public void mouseClicked(MouseEvent e) {<br />        //pobieramy współrzędne kliknięcia w okienku<br />        int x = e.getX();<br />        int y = e.getY();<br /><br />        String str = "Kliknięto x: "+x+" y: "+y;<br />        label.setText(str);<br /><br />        System.out.println(str);<br />    }<br /><br />    @Override<br />    public void mousePressed(MouseEvent e) {<br /><br />    }<br /><br />    @Override<br />    public void mouseReleased(MouseEvent e) {<br /><br />    }<br /><br />    @Override<br />    public void mouseEntered(MouseEvent e) {<br /><br />    }<br /><br />    @Override<br />    public void mouseExited(MouseEvent e) {<br /><br />    }<br />}</pre>
<p> </p>
<h2>Klasy wewnetrzne</h2>
<p>W java istnieje opcja zadeklarowania klasy wewnętrznej, czyli klasy w klasie. Istnieje kilka opcji:<br />&#8211; klasa prywatna wewnątrz klasy może być używana tylko w niej<br />&#8211; klasa publiczna może zostać zainicjowana po podaniu nazwy klasy głównej, a następnie po kropce klasy wewnętrznej</p>
<p> </p>
<h3>Przykład</h3>
<p><strong>plik ClassPrvPub.java</strong></p>
<pre>public class ClassPrvPub {<br />    //wewnętrzna prywatna klasa<br />    private class PrivCls{<br />        public void printInfo(){<br />            System.out.println("Jestem z prywatnej wewnętrznej klasy.");<br />        }<br />    }<br /><br />    //wewnętrzna prywatna klasa<br />    public class PubCls{<br />        public void printInfo(){<br />            System.out.println("Jestem z publicznej wewnętrznej klasy.");<br />        }<br />    }<br /><br />    //publiczna metoda wykorzystująca wewnętzną prywatną klasę<br />    public void run(){<br />        PrivCls prvCls = new PrivCls();<br />        prvCls.printInfo();<br /><br />        //możemy zadeklarować klasę wewnątrz metody<br />        class ClassInMethod{<br />            public void printInfo(){<br />                System.out.println("Klasa wewnątrz metody");<br />            }<br />        }<br />        ClassInMethod innerClass = new ClassInMethod();<br />        innerClass.printInfo();<br />    }<br />}</pre>
<p><strong>plik InnerClass.java</strong></p>
<pre>public class InnerClass {<br />    public static void main(String[] args) {<br />        //tworzymy obiekt klasy ClassPrvPub<br />        ClassPrvPub privExample = new ClassPrvPub();<br />        //wywołujemy metodę<br />        privExample.run();<br /><br />        //tworzymy obiekt publicznej klasy<br />        ClassPrvPub.PubCls pubClass = privExample.new PubCls();<br />        pubClass.printInfo();<br />    }<br />}</pre>
<p> </p>
<h2>Klasa Object</h2>
<p>Klasa Object jest bazową klasą Javy, każdy nowo tworzony obiekt rozszerza klasę Object.<br />Klasa ta posiada wiele przydatnych metod, część z nich juz poznaliście np. equals, to String itp.</p>
<h3>Przykład</h3>
<p><strong>plik CarObject.java</strong></p>
<pre>public class CarObject {<br />    private String manufacturer;<br />    private String model;<br />    private String color;<br /><br />    //dodajemy konstruktor Alt+g lub Alt+Insert lub...<br />    public CarObject(String manufacturer, String model, String color) {<br />        this.manufacturer = manufacturer;<br />        this.model = model;<br />        this.color = color;<br />    }<br /><br />    //przesłonimy teraz metodę toString, żeby wyświetlała więcej czytelnych informacji<br />    //Alt+g i wybieramy toString<br />/*<br />    @Override<br />    public String toString() {<br />        return "CarObject{" +<br />                "manufacturer='" + manufacturer + '\'' +<br />                ", model='" + model + '\'' +<br />                ", color='" + color + '\'' +<br />                '}';<br />    }*/<br />}</pre>
<p><strong>plik ObjectExample.java</strong></p>
<pre>//jak przesłonić metodę toString<br />public class ObjectExample {<br />    public static void main(String[] args) {<br />        CarObject car = new CarObject("Ford", "Focus","blue");<br />        CarObject car2 = new CarObject("Peugeot", "307SW", "blue");<br />        System.out.println(car); //zostanie wykorzystana automatycznie metoda toString i wyświetli: all.ObjectClass.CarObject@378bf509, po przesłonięciu metody otrzymamy bardziej czytelne informacje<br />        System.out.println(car.hashCode());//unikalna liczba na bazie CarObject<br /><br />        //sprawdzimy czy obiekty wskazują na to samo miejsce w pamięci<br />        if(car.equals(car2)){<br />            System.out.println("Obiekty wskazują na tą samą referencję, czyli miejsce w pamięci.");<br />        } else{<br />            System.out.println("Obiekty nie wskazują na tą samą referencję");<br />        }<br />    }<br />}</pre>
<h3> </h3>
<h3>Zadanie1:</h3>
<p>Napisz program sortujący tablicę metodą przez wybieranie zgodnie z poniższymi wytycznymi:</p>
<p><b>Sortowanie przez wybieranie</b> &#8211; jedna z prostszych metod sortowania o złożoności O(<i>n</i><sup>2</sup>). Polega na wyszukaniu elementu mającego się znaleźć na żądanej pozycji i zamianie miejscami z tym, który jest tam obecnie. Operacja jest wykonywana dla wszystkich indeksów sortowanej tablicy.</p>
<p>Algorytm przedstawia się następująco:</p>
<ol>
<li>wyszukaj minimalną wartość z tablicy spośród elementów od <tt>i</tt> do końca tablicy</li>
<li>zamień wartość minimalną, z elementem na pozycji <tt>i</tt></li>
</ol>
<p>Gdy zamiast wartości minimalnej wybierana będzie maksymalna, wówczas tablica będzie posortowana od największego do najmniejszego elementu.</p>
<p>Założenia do programu:</p>
<ul>
<li>program wykonywany w konsoli</li>
<li>sortowanie odbywa się malejąco, nie wykorzystuje gotowych funkcji do sortowania oraz do szukania maksimum</li>
<li>sortowana jest tablica 10 liczb całkowitych. Tablica jest polem klasy.</li>
<li>tablica jest wczytywana z klawiatury po uprzednim wypisaniu odpowiedniego komunikatu</li>
<li>wszystkie elementy posortowanej tablicy są wyświetlane na ekranie</li>
<li>klasa zawiera co najmniej dwie metody: sortującą i szukającą wartość najwyższą. Widzialność metody szukającej ogranicza się jedynie do klasy.</li>
<li>metoda szukająca zwraca wartość, w zależności od przyjętej taktyki może być to wartość maksymalna lub index wartości maksymalnej.</li>
<li>program powinien być zapisany czytelnie, z zasadami czystego formatowania kodu, należy stosować znaczące nazwy zmiennych i funkcji.</li>
</ul>
<p> </p>
<h3>Zadanie2:</h3>
<p><span id="page230R_mcid8" class="markedContent"><span dir="ltr" role="presentation">Napisz program, który szyfruje podany przez użytkownika tekst szyfrem podstawieniowym zwanym GADERYPOLUKI. Klucz </span><span dir="ltr" role="presentation">ten zawiera pary zamienników: GA</span><span dir="ltr" role="presentation">&#8211;</span><span dir="ltr" role="presentation">DE</span><span dir="ltr" role="presentation">&#8211;</span><span dir="ltr" role="presentation">RY</span><span dir="ltr" role="presentation">&#8211;</span><span dir="ltr" role="presentation">PO</span><span dir="ltr" role="presentation">&#8211;</span><span dir="ltr" role="presentation">LU</span><span dir="ltr" role="presentation">&#8211;</span><span dir="ltr" role="presentation">KI. Pierwsza litera w parze jest zastępowana na drugą, druga na pierwszą. </span><span dir="ltr" role="presentation">Dla przykładu litera G z</span><span dir="ltr" role="presentation">astępowana jest literą A, litera A literą G. Litery, których nie ma w kluczu (inne niż GADERYPOLUKI) </span><span dir="ltr" role="presentation">pozostają bez zmian. </span></span><span id="page230R_mcid9" class="markedContent"><span dir="ltr" role="presentation">Np. słowo PROGRAM po zaszyfrowaniu brzmi OYPAYGM, bo: </span></span><span id="page230R_mcid10" class="markedContent"> </span><span id="page230R_mcid11" class="markedContent"> </span><span id="page230R_mcid12" class="markedContent"><br role="presentation" /><span dir="ltr" role="presentation">P</span> </span><span id="page230R_mcid13" class="markedContent"><span dir="ltr" role="presentation">R</span> </span><span id="page230R_mcid14" class="markedContent"><span dir="ltr" role="presentation">O</span> </span><span id="page230R_mcid15" class="markedContent"><span dir="ltr" role="presentation">G</span> </span><span id="page230R_mcid16" class="markedContent"><span dir="ltr" role="presentation">R</span> </span><span id="page230R_mcid17" class="markedContent"><span dir="ltr" role="presentation">A</span> </span><span id="page230R_mcid18" class="markedContent"><span dir="ltr" role="presentation">M</span> </span><span id="page230R_mcid19" class="markedContent"></span><span id="page230R_mcid20" class="markedContent"><br role="presentation" /><span dir="ltr" role="presentation">O</span> </span><span id="page230R_mcid21" class="markedContent"><span dir="ltr" role="presentation">Y</span> </span><span id="page230R_mcid22" class="markedContent"><span dir="ltr" role="presentation">P</span> </span><span id="page230R_mcid23" class="markedContent"><span dir="ltr" role="presentation">A</span> </span><span id="page230R_mcid24" class="markedContent"><span dir="ltr" role="presentation">Y</span> </span><span id="page230R_mcid25" class="markedContent"><span dir="ltr" role="presentation">G</span> </span><span id="page230R_mcid26" class="markedContent"><span dir="ltr" role="presentation">M</span> </span><span id="page230R_mcid27" class="markedContent"></span><span id="page230R_mcid28" class="markedContent"> </span><span id="page230R_mcid29" class="markedContent"><br role="presentation" /><span dir="ltr" role="presentation">Założenia programu</span>:</span></p>
<ul>
<li><span id="page230R_mcid30" class="markedContent"><span dir="ltr" role="presentation">Program wykonywany w konsoli</span> </span><span id="page230R_mcid32" class="markedContent"></span></li>
<li><span id="page230R_mcid32" class="markedContent"><span dir="ltr" role="presentation">Jeżeli język programowania tego wymaga, można założyć dla uproszczenia, że tekst do zaszyfrowania ma </span><br role="presentation" /><span dir="ltr" role="presentation">maksymalnie 20 liter i zapisany jest małymi liter</span><span dir="ltr" role="presentation">ami oraz nie ma w nim innych znaków, cyfr, spacji</span> </span><span id="page230R_mcid33" class="markedContent"></span></li>
<li><span id="page230R_mcid33" class="markedContent"><span dir="ltr" role="presentation">Program zawiera funkcję szyfrującą, która przyjmuje jako argument wprowadzony tekst</span> </span><span id="page230R_mcid34" class="markedContent"></span></li>
<li><span id="page230R_mcid34" class="markedContent"><span dir="ltr" role="presentation">Funkcja zwraca zaszyfrowany tekst</span> </span><span id="page230R_mcid35" class="markedContent"></span></li>
<li><span id="page230R_mcid35" class="markedContent"><span dir="ltr" role="presentation">W programie głównym występuje wczytanie tekstu z klawiatury po uprzednim wyświetleniu st</span><span dir="ltr" role="presentation">osownego komunikatu </span><span dir="ltr" role="presentation">dla użytkownika, a po zaszyfrowaniu wyświetlenie zaszyfrowanej jego wersji</span>  </span><span id="page230R_mcid36" class="markedContent"></span></li>
<li><span id="page230R_mcid36" class="markedContent"><span dir="ltr" role="presentation">Program powinien być zapisany czytelnie, z zasadami czystego formatowania kodu, należy stosować znaczące nazwy </span><span dir="ltr" role="presentation">zmiennych i funkcji</span> </span></li>
</ul>
<p>Artykuł <a href="https://kamakaczmarek.net/14-java-obiektowo/">14. JAVA &#8211; obiektowo</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>13. JAVA &#8211; wyświetlanie danych metodą printf</title>
		<link>https://kamakaczmarek.net/13-java-wyswietlanie-danych-metoda-printf/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Thu, 27 May 2021 18:53:43 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[printf]]></category>
		<category><![CDATA[wyświetlanie danych]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=2763</guid>

					<description><![CDATA[<p>Metoda printf pozwala na wyświetlanie danych w określonym formacie.Dane wyświetlane tą metodą są formatowane na bazie szablonu i zestawu argumentów. System.out.printf("Hello %s %n", "World"); W powyższym przykładzie możemy zauważyć, iż korzystamy ze znaku %, który określa format danych składający się na pewien schemat.Następnie, po przecinku wypisujemy kolejne argumenty, które będą podstawiane do konkretnego szablonu.Możliwe formaty [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/13-java-wyswietlanie-danych-metoda-printf/">13. JAVA &#8211; wyświetlanie danych metodą printf</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Metoda <strong>printf</strong> pozwala na wyświetlanie danych w określonym formacie.<br />Dane wyświetlane tą metodą są formatowane na bazie szablonu i zestawu argumentów.</p>
<pre class="prettyprint">System.out.printf("Hello %s %n", "World");</pre>
<p>W powyższym przykładzie możemy zauważyć, iż korzystamy ze znaku %, który określa format danych składający się na pewien schemat.<br />Następnie, po przecinku wypisujemy kolejne argumenty, które będą podstawiane do konkretnego szablonu.<br />Możliwe formaty to:<br /><strong>%d</strong> &#8211; format dla liczb całkowitych<br /><strong>%f</strong> &#8211; format dla liczb rzeczywistych<br /><strong>%s</strong> &#8211; format dla ciągów znaków<br /><strong>%b</strong> &#8211; format dla typu logicznego<br /><strong>%n</strong> &#8211; znak nowej linii<br /><strong>%t..</strong> &#8211; format dla dat, który jest rozszerzany o następne formaty:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>A lub a</strong> &#8211; pełna nazwa dnia tygodnia lub skrócona<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>B lub b</strong> &#8211; pełna nazwa miesiąca lub 3 literowa nazwa miesiąca<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>c</strong> &#8211; cała data i czas<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>F</strong> &#8211; data w formacie 2021-05-27<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>T</strong> &#8211; godzina w formcie 24h / R &#8211; bez sekund / H &#8211; 2cyfrowa / k &#8211; bez zer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>r</strong> &#8211; godzina w formacie 12h / p &#8211; pm/am<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>M</strong> &#8211; minuty 2cyfrowo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>S</strong> &#8211; sekundy 2cyfrowo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Y lub y</strong> &#8211; rok 4cyfrowy lub 2cyfrowy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>m</strong> &#8211; 2cyfrowy miesiąc<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>d lub e</strong> &#8211; dzień 2cyfrowy lub bez zer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>s</strong> &#8211; znacznik czasowy/timestamp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Q</strong> &#8211; milisekundy<br /><strong>1..n$</strong> &#8211; możemy wskazać na konkretny argument do formatowania</p>
<h4>Przykłady:</h4>
<pre class="prettyprint">System.out.printf("%d %f %s %b %n", 10, 1.22f, "tekst", true);//10 1,220000 tekst true<br />System.out.printf("%tA %tb %tc %n", new Date(), new Date(), new Date());//czwartek maj czw. maj 27 20:25:17 CEST 2021<br />//aby nie powtarzać tego samego argumentu kilka razy, możemy wskazywać konkretny argument<br />System.out.printf("%1$tA %1$tb %1$tc %n", new Date());//czwartek maj czw. maj 27 20:25:17 CEST 2021<br /><br />String user = "user";<br />System.out.printf("Witaj %s, zostałeś zalogowany w %tA %2$tF", user, new Date());</pre>
<p>Artykuł <a href="https://kamakaczmarek.net/13-java-wyswietlanie-danych-metoda-printf/">13. JAVA &#8211; wyświetlanie danych metodą printf</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
