/* * * Tehtävä 1, Martin Pärtel * * * Arvostelun lähtökohta: * - Konstruktorit super-kutsuineen: 2p * - yhdiste: 2p * - leikkaus: 2p * - erotus: 2p * - esimerkki: 2p * * * Konstruktorit olivat monella väärin, vaikka tehtävä meni muuten hyvin. * Syntaksivirheistä menetti menetti yhden pisteen, kunhan extends ja * super-kutsut oikeilla parametreilla olivat vastauksessa. * super-kutsujen puuttumisesta menetti kaksi pistettä. * * * Eräs melko yleinen virhe oli this:n tai toinen-parametrin muokkaaminen * uuden IntJoukkoPlus-olion luonnin sijaan. Siitä menetti 1p/metodi. * Virhe esiintyi jostain syystä useimmiten yhdiste-metodissa. * Osa näistä virheistä johtui siitä, että kuviteltiin * `IntJoukkoPlus uusi = this;`-lauseen kopioivan olion sisällön eikä vain * viitettä siihen. * * * Pikkuvirheistä, kuten toIntArray():n unohtamisesta, menetti pääsääntöisesti * yhden pisteen. * * * Periaatteelliset väärinymmärrykset johtivat yleensä noin 3-6p kokonaissaaliiseen, * jos joukko-operaatioissa on edes yritetty jotain oikeanlaista. * Monet olivat esimerkiksi luulleet IntJoukkoPlus:lla olevan jotain tekemistä * ArrayList:n kanssa. Myös perinnän kanssa hapuiltiin ja IntJoukkoPlus:lle * tehtiin IntJoukko-tyyppisiä kenttiä. (Apumuuttujakentät olivat OK, * vaikka ovatkin kehnoa ja vähän vaarallista tyyliä). * * * Jotkut näkivät paljon vaivaa saadakseen tulosjoukolle täsmälleen riittävän * kapasiteetin. Tehtävä oli luvallista (ehkä jopa luontevaa) tulkita siten, * että IntJoukko osaa kasvaa tarpeen mukaan. Jos vastauksen koodi toimi oikein, * siitä sai täydet pisteet, vaikka siinä nähtiinkin ylimääräistä optimointivaivaa. * * * Muutama toteutti vastauksessaan IntJoukko-luokankin, vaikkei sitä pyydetty. * Tästä ei sakotettu ja vain tehtävän loppuosa tarkastettiin. * * * Tehtäväpaperissa pyydettiin nimenomaisesti, että esimerkkiohjelmassa * esitellään kaikkia, myös perittyjä, metodeja. Moni oli tämän valitettavasti * unohtanut. Jos esittelystä puuttui monta metodia, siitä menetti yhden pisteen. * Olivatpa jotkut unohtanteet koko esimerkinkin. * */ public class IntJoukkoPlus extends IntJoukko { public IntJoukkoPlus() { super(100); } public IntJoukkoPlus(int kapasiteetti) { super(kapasiteetti); } // Toimivia joukko-operaatioiden toteutustapoja oli useita. // Tässä ehkä yksinkertaisimmat. public IntJoukkoPlus yhdiste(IntJoukkoPlus toinen) { IntJoukkoPlus tulos = new IntJoukkoPlus(); for (int x : this.toIntArray()) { // for-each tulos.lisaa(x); } for (int x : toinen.toIntArray()) { tulos.lisaa(x); } return tulos; } public IntJoukkoPlus leikkaus(IntJoukkoPlus toinen) { IntJoukkoPlus tulos = new IntJoukkoPlus(); for (int x : this.toIntArray()) { if (toinen.kuuluu(x)) { tulos.lisaa(x); } } return tulos; } public IntJoukkoPlus erotus(IntJoukkoPlus toinen) { IntJoukkoPlus tulos = new IntJoukkoPlus(); for (int x : this.toIntArray()) { if (!toinen.kuuluu(x)) { tulos.lisaa(x); } } return tulos; } // Esimerkki public static void main(String[] args) { IntJoukkoPlus a = new IntJoukkoPlus(); IntJoukkoPlus b = new IntJoukkoPlus(); a.lisaa(1); a.lisaa(2); a.lisaa(3); a.lisaa(4); b.lisaa(3); b.lisaa(4); b.lisaa(5); System.out.println(a.mahtavuus()); // 4 System.out.println(a.kuuluu(3)); // true System.out.println(a.poista(3)); // true System.out.println(a.poista(57)); // false System.out.println(a.lisaa(3)); // true System.out.println(a.lisaa(3)); // false System.out.println(a.toIntArray()[0]); // 1 tai 2 tai 3 tai 4 System.out.println(a.yhdiste(b)); // {1, 2, 3, 4, 5} System.out.println(a.leikkaus(b)); // {3, 4} System.out.println(a.erotus(b)); // {1, 2} } }