Seuraavaan ongelmaan tarvitsisin neuvoja, poijaaaaat :)
Olen tekemässä tommosta pientä projektihommelia, jossa projektit (oliot) ja tehtävät (oliot) ovat keskeisessä roolissa. En ole keksinyt miten saan oikeille (käyttäjän valinta) projekteille lisättyä tehtäviä.
Projekteilla ja tehtävillä on molemmilla attribuutti tunnus (perivät yliluokasta), jonka avulla oikeat tehtävät pitäisi lisätä oikeisiin projekteihin. Projektit toimivat säiliöinä tehtäville ja toisille projekteille:
private Vector components = new Vector();
Tuohon yo. vektoriin lisätään projekteja ja/tai tehtäviä seuraavalla metodilla:
public void addComponent(Component component) { components.add(component); }
Tehtävä ja Projekti -luokat perivät Component-yliluokan, jossa ei ole määritelty kuin muutama attribuutti ja print(). Ne eivät liity tähän (paitsi tuo em. tunnus-attribuutti), joten en niitä tähän laita.
Nyt pääohjelmassa käyttäjälle tulostetaan olemassa olevat projektit ja kysytään, mihin projektiin tehtävä - joka siis luodaan vain ja ainoastaan, jos käyttäjän syöttämä projekti on olemassa - lisätään. Niin miten siis saisin lisättyä käyttäjän luoman tehtävän oikeaan projektiin?
Tosi huonosti selitetty, toivottavasti hiffasitte edes etäisesti :)
Itse käyttäisin Olio-relaatioita allaolevaan tyyliin. Aika pikaisesti kirjoitettu, mutta toivottavasti idea tulee selville.
class Projektit { Vector Projut; ... public void lisaaProjekti(Projekti projekti) { Projut.add(projekti); } } class Projekti extends Component{ Vector tehtavat; ... public void lisaaTehtava(Tehtava tehtava) { tehtavat.add(tehtava); } } class Tehtava extends Component { ... }
Ei oikein kehtaisi mennä räpeltämään enää uusiksi koko toteutusta. Mä yritän vielä selittää paremmin. Kyseessä on ilmeisestikin taas varsin simppeli probleema, vaan kun ei ole avautunut.
int tunnus=projekti.palautaLaskuri(); // projekti tuossa on "juuriprojekti"
Projekti p = new Projekti(tunnus);
Kun projekti luodaan yo. koodilla lisaaProjekti-metodissa, niin - korjatkaa, jos olen väärässä - kaikille lisaaProjekti-metodilla luoduille projekteille tulee viitteeksi p. Ongelmanihan ilmeisesti ratkeaisi, jos saisin jotenkin kaikille projekteille uniikin viitteen. Eli minun pitäisi saada tuo tunnus-attribuutin sisältämä sen hetkinen arvo viitteeksi kaikille projekteille. Projekti-luokan konstruktorissa kasvatetaan projektien lukumäärää aina yhdellä, kun uusi projekti luodaan, joten palautaLaskuri() palauttaa aina eri arvon, joka otetaan talteen tunnus-attribuuttiin.
Tunget ne Projektit Vectorin sijasta vaikkapa Hasmappiin, avaimena tunnuksesta tehty Integer. Sieltä mapista on sit kiva poimia aina haluttu Projekti.
On tuo Hashmappi tietorakenteena totaalisen outo. Mitenkäs tuo sitten pitäisi viritellä koodina?
Javadocien selailu kohteeseen java.util.HashMap mars!
class Projektit { HashMap projut; ... public void lisaaProjekti(Integer tunnus, Projekti projekti) { projut.put(tunnus, projekti); } } public Projekti haeProjekti(Integer tunnus) { return projut.get(tunnus); } }
renni kirjoitti:
Javadocien selailu kohteeseen java.util.HashMap mars!
public Projekti haeProjekti(Integer tunnus) { return projut.get(tunnus); } }
tohon returniin vielä classcasti return (Projekti) projut.get(tunnus);
Hyvä lisäys.
Menee kyllä vaikeeksi tässä vaiheessa tietorakenteen muuttelu. Minäpä kysäsen vielä kerran saman kysymyksen, jos sitä vaikka pärjäisi noilla vektoreilla.
Eli lisaaProjekti -metodissa on muuttuja tunnus. Joka kerta kun metodissa lisätään uusi projekti, tunnus-muuttujassa on eri arvo(yhtä suurempi).
Nyt kun luodaan uusi projekti, miten saan tuon tunnus-muuttujan sisältämän arvon viitteeksi luotavalle projektille?
Projekti proju = new Projekti (tunnus);
Koska muuttuja sisältää aina eri arvon, projektien lisäys ja poisto onnistuisi sitten eri viitteiden kautta. Onko tuo ylipäänsä mahdollista?
Projekti luokkaan konstruktori jokan tallentaa sitten tuon tunnuksen
Miten mä saan sitten sen muuttujan arvon viitteeksi?
litra kirjoitti:
renni kirjoitti:
Javadocien selailu kohteeseen java.util.HashMap mars!
public Projekti haeProjekti(Integer tunnus) { return projut.get(tunnus); } }tohon returniin vielä classcasti return (Projekti) projut.get(tunnus);
Kun tuo palauttaa tuon projektin, niin palauttaako se sen projektin sieltä HasMapista vai vain viitteen siihen projektiin? Miten se projekti otetaan talteen pääohjelmassa, jossa tuota haeProjekti -metodia kutsutaan.
Snifferi kirjoitti:
Kun tuo palauttaa tuon projektin, niin palauttaako se sen projektin sieltä HasMapista vai vain viitteen siihen projektiin? Miten se projekti otetaan talteen pääohjelmassa, jossa tuota haeProjekti -metodia kutsutaan.
Ajattelet asiaa jotenkin liian hankalasti ja C-mäisesti. Javassa _kaikki_ oliot ovat oikeasti vain viittauksia niihin olioihin (pinnan alla kaikki tapahtuu osoittimilla, mutta niistä ei javassa kannata välittää). Ei ole erikseen tapaa jolla pystyisit esimerkiksi lähettämään olion sisällön parametrinä jollekin funktiolle; kaikki tapahtuu siis referensseillä, joka javassa on oikeastaan sama kuin olio itse.
Projekti proj = haeProjekti(new Integer(1234)); proj.teeJotain();
Ei toimi, ei.
Tuohon on kyllä vähän paha tarjota apua. Voisitko tarkentaa? Mikä ei tomi? Mikä tällä kertaa on ongelma?
Mä oon pistänyt nuo projektit Vektoriin ja HashMappiin. Kaivan nuo projektit tuolta HashMapista tunnusta avaimena käyttäen. Tulostus/HasMapin läpikäyminen ilmeisesti tökkii.
public void print() { System.out.print("\n\n"+ "Projektin tunniste: " + id+"\n" +"Projektin nimi: " + nimi+"\n"+ "Vastuuhenkilo on " + vastuuhenkilo +"\n"+ "Projektin alkupaivamaara on: " +alkuPvm+"\n"+ "Projektin loppupaivamaara: " + loppuPvm+"\n"); for (int i = 0; i < components.size(); i++) { ((Component) components.get(i)).print(); System.out.print(" "); } System.out.print(""); }
Components-vektorin olen tulostanut yo. metodilla. Mites ton HashMapin tulostus oikein kävisi?
Jätä se Vector kokonaan pois, turha niitä projekteja on moneen paikkaan säilöä.
Javadoceja kannattaa opetella lukemaan. sielät esim näkyisi että HashMapiplla on metodi keySet() joka palauttaa kaikki mapissa olevat avaimet. Sitten on helppoa käydä tuo setti iteraattorilla läpi.
Minäpä laitan tähän nyt tuota koodia ihan kunnolla, jos joku viisaampi vois tsekata.
Class Projekti:
package oo.ht; import java.util.Vector; import java.util.Date; import java.util.HashMap; public class Projekti extends Component { private String nimi, vastuuhenkilo; private static int lkm=0; public Projekti () { lkm++; } public Projekti(int id, Date alkuPvm, Date loppuPvm, String nimi, String vastuuhenkilo ) { super(id, alkuPvm, loppuPvm); this.nimi=nimi; this.vastuuhenkilo=vastuuhenkilo; lkm ++; } public void aseta_id(int id) { this.id=id; } public void aseta_alkuPvm(Date alkuPvm) { this.alkuPvm=alkuPvm; } public void aseta_loppuPvm(Date loppuPvm) { this.loppuPvm=loppuPvm; } public void aseta_nimi (String nimi) { this.nimi=nimi; } public void aseta_vastuuhenkilo (String vastuuhenkilo) { this.vastuuhenkilo=vastuuhenkilo; } private Vector components = new Vector(); private HashMap komponentit = new HashMap(); public int palautaLaskuri() { return lkm; } public void lisaaLaskuria() { lkm++; } public void lisaaKomponentti(Integer tunnus, Component c) { komponentit.put(tunnus, c); } public Component haeKomponentti(Integer tunnus) { return (Component)komponentit.get(tunnus); } public void addComponent(Component component) { components.add(component); } public void removeComponent(Component component) { components.remove(component); } public void print() { System.out.print("\n\n"+ "Projektin tunniste: " + id+"\n" +"Projektin nimi: " + nimi+"\n"+ "Vastuuhenkilo on " + vastuuhenkilo +"\n"+ "Projektin alkupaivamaara on: " +alkuPvm+"\n"+ "Projektin loppupaivamaara: " + loppuPvm+"\n"); for (int i = 0; i < components.size(); i++) { ((Component) components.get(i)).print(); System.out.print(" "); } System.out.print(""); } }
Pääohjelma:
//luokkakohtainen "juuriprojekti" private static Projekti projekti = new Projekti(); public static void lisaaProjekti() throws IOException{ BufferedReader stdin = new BufferedReader ( new InputStreamReader ( System.in )); //Tässä annetaan arvot "juuriprojektille", eli siitä tehdään siis eka projekti if (projekti.palautaLaskuri()==1) { int tunnus=projekti.palautaLaskuri(); projekti.aseta_id(tunnus); System.out.println("Anna projektille nimi"); String nimi=stdin.readLine(); projekti.aseta_nimi(nimi); System.out.println("Anna projektin vastuuhenkilo"); String vastuuhenkilo=stdin.readLine(); projekti.aseta_vastuuhenkilo(vastuuhenkilo); System.out.println("Anna projektin alkupaiva"); int paiva=lue_int(); System.out.println("Anna projektin alkukuukausi"); int kk=lue_int(); System.out.println("Anna projektin alkuvuosi"); int vuosi=lue_int(); System.out.println("Anna projektin loppupaiva"); int loppPaiva=lue_int(); System.out.println("Anna projektin loppukuukausi"); int loppKk=lue_int(); System.out.println("Anna projektin loppuvuosi"); int loppVuosi=lue_int(); Date d1 = new Date(vuosi-1900, kk-1, paiva); Date d2 = new Date(loppVuosi-1900, loppKk-1, loppPaiva); Integer kokoOlio = new Integer (tunnus); projekti.aseta_alkuPvm(d1); projekti.aseta_loppuPvm(d2); projekti.lisaaLaskuria(); tulostaProjektit(); } // Tällä luodaan kaikki muut projektit else { int tunnus=projekti.palautaLaskuri(); System.out.println("Anna projektille nimi"); String nimi=stdin.readLine(); System.out.println("Anna projektin vastuuhenkilo"); String vastuuhenkilo=stdin.readLine(); System.out.println("Anna projektin alkupaiva"); int paiva=lue_int(); System.out.println("Anna projektin alkukuukausi"); int kk=lue_int(); System.out.println("Anna projektin alkuvuosi"); int vuosi=lue_int(); System.out.println("Anna projektin loppupaiva"); int loppPaiva=lue_int(); System.out.println("Anna projektin loppukuukausi"); int loppKk=lue_int(); System.out.println("Anna projektin loppuvuosi"); int loppVuosi=lue_int(); Date d1 = new Date(vuosi-1900, kk-1, paiva); Date d2 = new Date(loppVuosi-1900, loppKk-1, loppPaiva); Projekti p = new Projekti(tunnus, d1, d2, nimi, vastuuhenkilo); Integer olio = new Integer (tunnus); p.lisaaKomponentti(olio, p); // projeki HashMappiin projekti.addComponent(p); // projekti juuriprojektin sisälle tulostaProjektit(); } } public static void lisaaTehtava() throws IOException { BufferedReader stdin = new BufferedReader ( new InputStreamReader ( System.in )); tulostaProjektit(); System.out.println("\nMihin projektiin haluat lisata tehtavan"); int valinta=lue_int(); /* Tässä nyt pitäisi tsekata, onko käyttäjän haluamaa projektia olemassa, jonka sisälle tässä nyt luotava tehtävä laitetaan Projekti-luokassa olevalla addComponent -metodilla. */ Tehtava tehtava = new Tehtava(); int tunnus=tehtava.palautaLkm(); System.out.println("\nAnna tehtavaalkupaiva"); int paiva=lue_int(); System.out.println("Anna tehtavan alkukuukausi"); int kk=lue_int(); System.out.println("Anna tehtavan alkuvuosi"); int vuosi=lue_int(); System.out.println("Anna tehtavan loppupaiva\n"); int loppPaiva=lue_int(); System.out.println("Anna tehtavanloppukuukausi"); int loppKk=lue_int(); System.out.println("Anna tehtavan loppuvuosi"); int loppVuosi=lue_int(); Date d3 = new Date(vuosi-1900, kk-1, paiva); Date d4 = new Date(loppVuosi-1900, loppKk-1, loppPaiva); Tehtava t = new Tehtava(tunnus, d3, d4); Integer kokonaisOlio = new Integer (tunnus); // Tässä pitäisi sitten laittaa tehtävä halutun projektin sisälle ja myös HashMappiin. } }
Mod. edit: yks / liikaa tageissa
Sössin noitten koodi-tagien kanssa, joten ei ole tuo toinen osa kovin luettavaa. Jostain syystä ei anna muokata. Renni, tuo Vektori on pakottavista syistä mukana kuvioissa :).
Aihe on jo aika vanha, joten et voi enää vastata siihen.