{"id":328,"date":"2020-04-17T05:13:24","date_gmt":"2020-04-17T02:13:24","guid":{"rendered":"https:\/\/coursepages.uta.fi\/tiea2-1b\/?page_id=328"},"modified":"2020-05-08T01:19:45","modified_gmt":"2020-05-07T22:19:45","slug":"kysymyksia-ja-vastauksia","status":"publish","type":"page","link":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/kevat-2020\/harjoitustyo\/kysymyksia-ja-vastauksia\/","title":{"rendered":"Kysymyksi\u00e4 ja vastauksia"},"content":{"rendered":"<p><strong>1. T\u00e4ytyyk\u00f6 Comparable&lt;T&gt;-rajapinta toteuttaa omassa listassa?<\/strong><\/p>\n<p>Ei. Toteutus tarvittaisiin, jos tavoitteena olisi verrata kesken\u00e4\u00e4n omia listoja. <em>Comparable&lt;T&gt;-<\/em>rajapinnan teht\u00e4v\u00e4n\u00e4 on mahdollistaa listan alkioiden vertailu. Rajapinta toteutetaan <em>Dokumentti<\/em>-luokassa, jotta oman listan <em>lis\u00e4\u00e4<\/em>-metodissa voidaan vertailla kesken\u00e4\u00e4n listalle lis\u00e4tt\u00e4v\u00e4\u00e4 dokumenttia ja listalle s\u00e4il\u00f6ttyj\u00e4 dokumentteja.<\/p>\n<p><strong>2. Miten oman listan lis\u00e4\u00e4-metodi toteutetaan?<\/strong><\/p>\n<p>Metodissa pit\u00e4\u00e4 hakea lis\u00e4yspaikka uudelle alkiolle. Lis\u00e4yspaikan p\u00e4\u00e4ttely tehd\u00e4\u00e4n silmukkaa ja <em>Comparable&lt;T&gt;<\/em>-rajapinnan <em>compareTo<\/em>-metodia k\u00e4ytt\u00e4en. Silmukassa vertaillaan nykyist\u00e4 listan alkiota lis\u00e4tt\u00e4v\u00e4\u00e4n alkioon (tai p\u00e4invastoin) <em>compareTo<\/em>-metodilla, kunnes lis\u00e4yspaikka l\u00f6ytyy.<\/p>\n<p><em>CompareTo<\/em>-metodia ei voi kutsua suoraan metodin parametrin tai listan alkion kautta, koska ne ovat <em>E<\/em>-tyyppi\u00e4. T\u00e4st\u00e4 syyst\u00e4 olioon, jonka kautta metodin kutsu tehd\u00e4\u00e4n, on lis\u00e4tt\u00e4v\u00e4 <em>Comparable<\/em>-tyyppinen viite:<\/p>\n<pre>int ind = 0;\r\nwhile (...) {\r\n   \/\/ Asetetaan nykyiseen alkioon compareTo-metodiin perustuvan\r\n   \/\/ vertailun mahdollistava apuviite. T\u00e4m\u00e4 on k\u00e4\u00e4nt\u00e4j\u00e4n mielest\u00e4\r\n   \/\/ vaarallista, koska kieliopillisesti ei voida p\u00e4\u00e4tell\u00e4 onko\r\n   \/\/ lis\u00e4tt\u00e4v\u00e4n olion luokalla Comparable-toteutus. K\u00e4\u00e4nt\u00e4j\u00e4n\r\n   \/\/ mutinat estet\u00e4\u00e4n annotaatiolla.\r\n   Comparable nykyinen = (Comparable)get(ind);\r\n   ...\r\n   if (nykyinen.compareTo(uusi)...) {\r\n   ...\r\n}<\/pre>\n<p>Lis\u00e4yksess\u00e4 on erikoistapaus: lis\u00e4yspaikka on listan loppu, jos lis\u00e4tt\u00e4v\u00e4 alkio on kaikkia listan alkioita suurempi.<\/p>\n<p>Uusi alkio lis\u00e4t\u00e4\u00e4n kaikkien samanarvoisten alkioiden j\u00e4lkeen. N\u00e4in ensimm\u00e4isen\u00e4 listalle lis\u00e4tty alkio on listalla ennen kaikkia muita samanarvoisia alkoita. Toisena lis\u00e4tty samanarvoinen alkio on heti ensimm\u00e4isen samanarvoisen alkion j\u00e4lkeen ja kaikki muut samanarvoiset alkiot seuraavat t\u00e4t\u00e4 alkiota ja niin edelleen. Kaikki aiemmin lis\u00e4tyt samanarvoiset alkiot ovat ennen viimeisen\u00e4 lis\u00e4tty\u00e4 samanarvoista alkiota.<\/p>\n<p><strong>3. Pit\u00e4\u00e4k\u00f6 oman listan lis\u00e4\u00e4-metodissa lajitella?<\/strong><\/p>\n<p>Kyll\u00e4 ja ei. Kyll\u00e4, koska <em>lis\u00e4\u00e4<\/em>-metodi on itsess\u00e4\u00e4n lajittelualgoritmi. Ei, koska metodissa ei saa k\u00e4ytt\u00e4\u00e4 mit\u00e4\u00e4n muuta tapaa lajitteluun. Esimerkiksi Javan <em>Collections<\/em>-luokan lajittelumetodia ei saa kutsua.<\/p>\n<p><strong>4. Mit\u00e4 tarkoittaa MALFORMED?<\/strong><\/p>\n<p>WETO tulostaa virheilmoituksen MALFORMED, jos zip-paketin purkaminen ei onnistu.<\/p>\n<p>Harjoitusty\u00f6ss\u00e4 n\u00e4in voi tapahtua l\u00e4hinn\u00e4, kun pakkaushakemiston tai jonkin tiedoston nimess\u00e4 on skandinaavisen aakkosen tapainen perus-ASCII-merkist\u00f6\u00f6n kuulumaton merkki ja paketti on luotu Windows-j\u00e4rjestelm\u00e4ss\u00e4. WETO pys\u00e4ytt\u00e4\u00e4 t\u00e4ll\u00f6in testauksen jo ennen sen alkua k\u00e4ytt\u00f6j\u00e4rjestelm\u00e4tasoisen virheen vuoksi, koska Windowsissa harmiton merkki on &#8221;r\u00e4j\u00e4ht\u00e4nyt&#8221;\u00a0zip-pakettia Linux-j\u00e4rjestelm\u00e4ss\u00e4 purettaessa siten, ett\u00e4 hakemiston tai tiedoston nimeen on tullut laiton merkki.<\/p>\n<p>Zip-paketin tarkistus ennen sen purkua ei ole mahdollista opettajan toimesta.<\/p>\n<p><strong>5. Miksi ohjelmani kaatuu WETO-testiss\u00e4?<\/strong><\/p>\n<p>Lue aluksi testin kuvaus; siit\u00e4 voi p\u00e4\u00e4tell\u00e4 paljon. Jos ongelma ei selvi\u00e4 koodia lukemalla, niin voit toistaa testin sen kuvauksen perusteella omassa testiluokassa. NetBeans tai vastaava ohjelma tarjoaa graafisen debuggerin, jolla on helpompaa seurata ohjelman toimintaa kuin\u00a0tulostuslauseilla. Opettaja auttaa, jos ongelma ei selvi\u00e4 oman testauksen avulla. Ohjelmasi voi kaatua yll\u00e4tt\u00e4v\u00e4sti, jos palautat koodin testauskohtaan, jossa oletetaan edellisen kohdan testit onnistuneiksi.<\/p>\n<p>Tavallista yll\u00e4tt\u00e4v\u00e4mpi\u00e4 ongelmia on tapahtunut muun muassa seuraavista syist\u00e4: luokan otsikkoon on lis\u00e4tty ylim\u00e4\u00e4r\u00e4isi\u00e4 geneerisi\u00e4 parametreja, abstraktin luokka on palautettu testausosioon, jossa kyseinen luokka oletetaan konkreettiseksi, versionhallinnan haara on nimetty skandinaavisia kirjaimia k\u00e4ytt\u00e4en.<\/p>\n<p><strong>6. Miss\u00e4 luokassa latauksen tulisi tapahtua?<\/strong><\/p>\n<p>Latausmetodin paras paikka on <em>Kokoelma<\/em>-luokka, koska my\u00f6s <em>reset<\/em>-komento lataa. Voit v\u00e4litt\u00e4\u00e4 kokoelma- ja sulkusanatiedostojen nimet kokoelmalle rakentajan parametrien kautta.<\/p>\n<p><strong>7. Miksi siivoa-metodi ei toimi?<\/strong><\/p>\n<p>Tarkista aluksi, ett\u00e4 siivous tehd\u00e4\u00e4n teht\u00e4v\u00e4nannossa ja kommenteissa kerrotussa j\u00e4rjestyksess\u00e4.<\/p>\n<p><em>String<\/em>-luokan <em>replaceAll<\/em>-metodin ensimm\u00e4inen parametri on s\u00e4\u00e4nn\u00f6llinen ilmaus. K\u00e4yt\u00e4 t\u00e4t\u00e4 metodia vain, jos tied\u00e4t mit\u00e4 s\u00e4\u00e4nn\u00f6lliset ilmaukset ovat.<\/p>\n<p><em>String<\/em>-luokan <em>replace<\/em>-metodi korvaa osamerkkijonoja &#8221;suoraan&#8221; eli ilman s\u00e4\u00e4nn\u00f6llisen\u00e4 ilmauksena m\u00e4\u00e4ritelty\u00e4 &#8221;hahmoa&#8221;. Metodi poistaa l\u00f6yt\u00e4m\u00e4ns\u00e4 esiintym\u00e4t, kun toisen parametrin arvoksi annetaan tyhj\u00e4 merkkijono &#8221;&#8221;. Sulkusanaa on edellett\u00e4v\u00e4 ja seurattava yksi v\u00e4lily\u00f6nti, kun <em>r<\/em><em>eplace<\/em>-metodia k\u00e4ytet\u00e4\u00e4n sulkusanojen poistoon, jotta ei poistettaisi vahingossa avainten osia. Tekstin alussa tai lopussa olevan sulkusanan voi poistaa vastaavasti <em>startsWith<\/em>&#8211; tai <em>endsWith<\/em>-metodeilla, joita k\u00e4ytett\u00e4ess\u00e4 on muistettava edelleen est\u00e4\u00e4 avainten osien poisto v\u00e4lily\u00f6nnin avulla. Huomaa, ett\u00e4 v\u00e4limerkit ja sulkusanat voi poistaa my\u00f6s ilman edell\u00e4 mainittuja metodeja tekem\u00e4ll\u00e4 hieman enemm\u00e4n oma koodia.<\/p>\n<p><strong>8. Miten poistan tiedoston versionhallinnasta?<\/strong><\/p>\n<p>Ota yhteytt\u00e4 opettajaan, jos jonkin tiedoston poisto on ehdottoman t\u00e4rke\u00e4\u00e4. \u00c4l\u00e4 tee muussa tapauksessa mit\u00e4\u00e4n (99,9 % tapauksista). Versionhallinta osaa sopeutua itse tilanteeseen, kun jokin tiedosto poistetaan projektista tai nimet\u00e4\u00e4n uudelleen. Poistettua tiedostoa ei tarvitse eik\u00e4 oikeastaan pid\u00e4 poistaa versionhallinnasta manuaalisesti, koska versionhallinnan teht\u00e4v\u00e4n\u00e4 on muistaa my\u00f6s poistetut tiedostot. \u00c4l\u00e4 poista tiedostoja et\u00e4varastosta Tuni-Gitlabin kautta. Kaikki muutokset tehd\u00e4\u00e4n paikallisesti, versioidaan ja ladataan et\u00e4varastoon, jotta asiat eiv\u00e4t monimutkaistuisi turhaan.<\/p>\n<p><strong>9. Pit\u00e4\u00e4k\u00f6 p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4 muotoilla?<\/strong><\/p>\n<p>P\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n tiedot voi tulostaa ilman muotoilijaluokkaa. P\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n j\u00e4rjestysluvut saa luettua helposti <em>LocalDate<\/em>-luokan aksessoreilla <em>getDayOfMonth<\/em>, <em>getMonthValue<\/em> ja <em>getYear<\/em>.<\/p>\n<p><strong>10. Mik\u00e4 on virhe 137?<\/strong><\/p>\n<p>WETOn virhekoodi 137 tarkoittaa, ett\u00e4 WETO on pys\u00e4ytt\u00e4nyt ikuiseen silmukkaan joutuneen ohjelman suorituksen. N\u00e4in voi k\u00e4yd\u00e4 esimerkiksi oman listan <em>lis\u00e4\u00e4<\/em>-metodissa, kun lis\u00e4ys tehd\u00e4\u00e4n silmukassa ja silmukkaa jatketaan lis\u00e4yksen j\u00e4lkeen, jolloin listalle lis\u00e4t\u00e4\u00e4n toistuvasti, kunnes aika loppu.<\/p>\n<p><strong>11. .git-hakemisto ei n\u00e4y?<\/strong><\/p>\n<p><em>.git<\/em>-hakemisto on aina k\u00e4tketty versionhallinnan toimesta. Hakemisto ei n\u00e4y graafisessa tiedostonhallinnassa eik\u00e4 komentoikkunan listauksessa ilman eri toimia. Kaikki on siksi kunnossa, kun hakemisto on k\u00e4tketty. Voit aina testata onko hakemistossa tai sen ylihakemistossa <em>.git<\/em>\u00a0 antamalla jonkin Git-komennon. Jos esimerkiksi <em>log<\/em>-komento tulostaa versiohistorian, on versionhallinta ja sit\u00e4 my\u00f6t\u00e4 <em>.git<\/em>-hakemisto kunnossa.<\/p>\n<p><strong>12. Miksi testi 4.7 ei onnistu, vaikka luon listaolion?<\/strong><\/p>\n<p>Tarkista, ett\u00e4 liit\u00e4t olion attribuuttiin. Jos olio liitet\u00e4\u00e4n paikalliseen viitteeseen, katoaa viite ja samalla olio, kun rakentajasta poistutaan. Esimerkiksi lausetta:<\/p>\n<pre>OmaLista&lt;Dokumentti&gt; dokumentit = new OmaLista&lt;Dokumentti&gt;();<\/pre>\n<p>k\u00e4ytett\u00e4ess\u00e4 k\u00e4y n\u00e4in. Java-k\u00e4\u00e4nt\u00e4j\u00e4 ei valita siit\u00e4, ett\u00e4 paikallisen muuttujan tunnus on sama kuin attribuutin tunnus. Tunnuksen peitt\u00e4miseen tutustuttiin edellisen kurssin materiaalissa ja my\u00f6s harjoituksissa.<\/p>\n<p><strong>13. Ovatko tyyppimuunnokset sallittuja lajittele-metodia kutsuttaessa?<\/strong><\/p>\n<p>Kyll\u00e4. OmaLista-luokan <em>lajittele<\/em>-metodin on oltava sovellusriippumaton. Siin\u00e4 ei saa k\u00e4ytt\u00e4\u00e4 esimerkiksi <em>Dokumentti<\/em>-tunnusta. Toisaalta t\u00e4t\u00e4 metodia kokoelman metodista kutsuttaessa voi olla pakko mainita tyyppej\u00e4. Kutsussa saa siten k\u00e4ytt\u00e4\u00e4 tyyppej\u00e4 ja niiden muunnoksia t\u00e4ysin vapaasti.<\/p>\n<p><strong>14. Kuinka est\u00e4\u00e4 uutisen lis\u00e4\u00e4minen vitsikokoelmaan?<\/strong><\/p>\n<p>Tarkista voiko <em>add<\/em>-komennon parametriksi annetusta merkkijonosta luoda uutisen, kun kokoelma koostuu vitseist\u00e4. Tulosta virheilmoitus ja keskeyt\u00e4 lis\u00e4ys, jos uutisen luominen onnistuu.<\/p>\n<p><strong>15. Miksi ohjelmani kaatuu WETOssa, vaikka sy\u00f6tteiden lukeminen toimii omalla koneellani?<\/strong><\/p>\n<p>Tarkista ettei standardisy\u00f6tevirtaan <em>System.in<\/em> ole liitetetty yht\u00e4 useampia <em>Scanner<\/em>-olioita. Java ei takaa mit\u00e4 tapahtuu, kun tiettyyn tietovirtaan liitet\u00e4\u00e4n useampia lukijoita. <em>Scanner<\/em>-olio sekaantuu valitettavasti vasta, kun sy\u00f6tteit\u00e4 tulee nopeampaan tahtiin esimerkiksi, kun ohjelmaa testataan uudelleenohjauksella WETOssa. Ongelman pit\u00e4isi ilmet\u00e4 my\u00f6s omalla koneella uudelleenohjausta k\u00e4ytett\u00e4ess\u00e4. Esimerkiksi komennon:<\/p>\n<pre>java Oope2HT ..\\esimerkit\\jokes_oldies.txt ..\\esimerkit\\stop_words.txt &lt; ..\\esimerkit\\input_brain_check.txt<\/pre>\n<p>pit\u00e4isi aiheuttaa poikkeus, kun sy\u00f6tevirrasta luetaan usealla lukijalla. Edellinen komento on annettu Windows j\u00e4rjestelm\u00e4ss\u00e4, jossa esimerkkitiedostot ovat ajohakemiston ylihakemiston <em>esimerkit<\/em>-alihakemistossa.<\/p>\n<p>Ongelma on todenn\u00e4k\u00f6isesti helposti korjattavissa, jos luet sy\u00f6tteet p\u00e4\u00e4silmukassa. T\u00e4ll\u00f6in riitt\u00e4\u00e4, ett\u00e4 siirr\u00e4t olion luonnin ennen silmukkaa. Esimerkiksi:<\/p>\n<pre>\/\/ P\u00e4\u00e4silmukka.\r\ndo {\r\n   \/\/ T\u00e4ll\u00e4 luetaan sy\u00f6tteet.\r\n   Scanner lukija = new Scanner(System.in);\r\n\r\n   \/\/ Tulostetaan kehote ja luetaan komentorivi.\r\n   System.out.println(KEHOTE);\r\n   String komentorivi = lukija.nextLine();\r\n\r\n--&gt;\r\n\r\n\/\/ T\u00e4ll\u00e4 luetaan sy\u00f6tteet.\r\nScanner lukija = new Scanner(System.in);\r\n\r\n\/\/ P\u00e4\u00e4silmukka.\r\ndo {\r\n   \/\/ Tulostetaan kehote ja luetaan komentorivi.\r\n   System.out.println(KEHOTE);\r\n   String komentorivi = lukija.nextLine();<\/pre>\n<p>Korvaa paikallinen <em>Scanner<\/em>-muuttuja k\u00e4tketyll\u00e4 attribuutilla, jos p\u00e4\u00e4silmukasta kutsutaan erillist\u00e4 metodia, jossa sy\u00f6tteet luetaan.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. T\u00e4ytyyk\u00f6 Comparable&lt;T&gt;-rajapinta toteuttaa omassa listassa? Ei. Toteutus tarvittaisiin, jos tavoitteena olisi verrata kesken\u00e4\u00e4n omia listoja. Comparable&lt;T&gt;-rajapinnan teht\u00e4v\u00e4n\u00e4 on mahdollistaa listan alkioiden vertailu. Rajapinta toteutetaan Dokumentti-luokassa, jotta oman listan lis\u00e4\u00e4-metodissa voidaan vertailla kesken\u00e4\u00e4n listalle lis\u00e4tt\u00e4v\u00e4\u00e4 dokumenttia ja listalle s\u00e4il\u00f6ttyj\u00e4 dokumentteja. 2. Miten oman listan lis\u00e4\u00e4-metodi toteutetaan? Metodissa pit\u00e4\u00e4 hakea lis\u00e4yspaikka uudelle alkiolle. Lis\u00e4yspaikan p\u00e4\u00e4ttely tehd\u00e4\u00e4n &hellip; <a href=\"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/kevat-2020\/harjoitustyo\/kysymyksia-ja-vastauksia\/\" class=\"more-link\">Jatka artikkeliin <span class=\"screen-reader-text\">Kysymyksi\u00e4 ja vastauksia<\/span><\/a><\/p>\n","protected":false},"author":6,"featured_media":0,"parent":278,"menu_order":2,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-328","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages\/328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/comments?post=328"}],"version-history":[{"count":41,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages\/328\/revisions"}],"predecessor-version":[{"id":451,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages\/328\/revisions\/451"}],"up":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages\/278"}],"wp:attachment":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/media?parent=328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}