Gå til innhold

[Løst]Trøtt student; Roter litt med generics tror jeg


Anbefalte innlegg

Greit, neste oblig er lagt ut. Jeg er litt forvirret angående dette med generiske datatyper. Med oppgaven fulgte det tre interface som jeg skal lage klasser som implementerer. Greit nok. Interfacene heter; BinaerTre, Adresse og Kontakt.

Hele oppgaven går ut på å lese inn kontakter fra en fil og sortere dem i et binært tre. Noe jeg fint hadde klart hadde det ikke vært for at det følger med tre interfaces. Selv om det er åpenbart hvilken datatype vi skal bruke så må alt være så jævlig objekt orientert.

 

Jeg ligger ved alle de filene som fulgte med bare sånn at dere har all dokumentasjon for å klare å kommentere.

 

BinaerTre

Klikk for å se/fjerne innholdet nedenfor

public interface BinaerTre<E extends Comparable<E>> extends Iterable<E> {

	/** Datainvariant for binaere soeketraer:
	 *
 * For enhver node i treet, er verdien av noden stoerre enn verdien
 * til hver node i venstre subtre, og mindre enn verdien til hver node i
 * hoeyre subtre.
 */

/**
 * Finner et element i binaertreet.
 *
 * Soeking gjoeres slik: begynn ved roten av treet, og soek
 * rekursivt til venstre (hvis verdien er mindre) eller hoeyre
 * (hvis den er stoerre), inntil du finner noden med riktig verdi
 * (compareTo() == 0). Hvis du naar en loevnode uten aa ha
 * funnet verdien, finnes den ikke i treet.
 *
 * @param data
 * @return dataelementet fra treet som matcher 'data', eller null
 *  hvis den ikke finnes
 */
public E finn(E data);

/**
 * Setter inn et element av typen E i binaertreet.
 *
 * Innsetting gjoeres slik: begynn ved roten av treet, og soek
 * rekursivt til venstre (hvis verdien er mindre) eller hoeyre
 * (hvis den er stoerre), inntil man naar en loevnode i treet -- da
 * kan man legge til en ny node som venstre eller hoeyre barn
 * av loevnoden.
 *
 * @param data
 * @return true hvis vellykket, false hvis ikke
 */
public boolean settInn(E data);

/**
 * Sletter et element av type E fra treet.  Dette er ikke saa helt
 * enkelt...
 * @param data
 * @return true hvis vellykket
 */
public boolean slett(E data);

/**
 * Henter antall elementer i treet.
 * @return
 */
public int hentAntall();

}

 

Kontakt

Klikk for å se/fjerne innholdet nedenfor

public interface Kontakt extends Comparable<Kontakt> {


/**
 * Henter fornavnet til kontakten
 * @return String fornavn
 */
public String hentFornavn();

/**
 * Henter etternavnet til kontakten
 * @return String etternavn
 */
public String hentEtternavn();

/**
 * Henter adressen til kontakten
 * @return Adresse adresse
 */
public Adresse hentAdresse();

/**
 * Henter foedselsdatoen til kontakten
 * @return Date foedselsdato
 */
public String hentFoedselsDato();

/**
 * Henter kategorien kontakten tilhoerer, eks. venner, jobb
 * @return String kategori
 */
public String hentKategori();

/**
 * Henter mobiltelefonnummeret til kontakten
 * @return int mobiltelefon
 */
public int hentMobilTelefon();

/**
 * Henter hjemmetelefonnummeret til kontakten
 * @return int hjemmetelefon
 */
public int hentHjemmeTelefon();

/**
 * Setter fornavnet til kontakten
 * @param fornavn
 */
public void settFornavn(String fornavn);

/**
 * Setter etternavnet til kontakten
 * @param etternavn
 */
public void settEtternavn(String etternavn);

/**
 * Setter adressen til kontakten
 * @param adresse
 */
public void settAdresse(Adresse adresse);

/**
 * setter foedselsdatoen til kontakten
 * @param foedselsDato
 */
public void settFoedselsDato(String foedselsDato);

/**
 * setter kategorien til kontakten, eks. venner, jobb
 * @param kategori
 */
public void settKategori(String kategori);

/**
 * Setter mobiltelefonnummeret til kontakten
 * @param mobilTelefon
 */
public void settMobilTelefon(int mobilTelefon);

/**
 * Setter hjemmetelefonnummeret til kontakten
 * @param hjemmeTelefon
 */
public void settHjemmeTelefon(int hjemmeTelefon);
}

 

Adresse

Klikk for å se/fjerne innholdet nedenfor

public interface Adresse {

/**
 * Henter gatenavnet til adressen
 * @return String gateNavn
 */
public String hentGate();

/**
 * Henter gatenummeret til adressen
 * @return String gateNummer
 */
public String hentGateNummer();

/**
 * Henter postnummeret til adressen
 * @return int postnummer
 */
public int hentPostnummer();

/**
 * Henter byen til adressen
 * @return String by
 */
public String hentBy();

/**
 * Setter gatenavnet til adressen
 * @param gate
 */
public void settGate(String gate);

/**
 * Setter gatenummeret til adressen
 * @param gateNummer
 */
public void settGateNummer(String gateNummer);

/**
 * Setter postnummeret til adressen
 * @param postNummer
 */
public void settPostnummer(int postNummer);

/**
 * Setter byen til adressen
 * @param by
 */
public void settBy(String by);

}

 

Der er de interfacene som følger med oppgaven. Nå skal jeg liksom lage Tre klasser som implementerer de over.

Problemene oppstår på grunn av måten BinaerTre er definert på, jeg får ikke endret noe som helst i klassen som implementerer BinaerTre uten at eclipse klikker mongo. De fleste metodene i BinaerTre skal jo jobbe med Kontakt objektet eller et løv objekt, spørs jo litt hvilken vinkel jeg velger.

 

Først skal jeg lage klassen Treet, som implementerer BinaerTre.

post-24640-1240191279_thumb.jpg

 

Greit nok, da får jeg følgende klasse

 

public class Treet implements BinaerTre<E> {

public Treet() {
	// TODO Auto-generated constructor stub
}

}

 

Hvis jeg nå høyreklikker på Treet og lar eclipse fylle ut resten av de uimplementerte metodene ender jeg opp med følgende greie:

 

Klikk for å se/fjerne innholdet nedenfor

import java.util.Iterator;


public class Treet implements BinaerTre<E> {

public Treet() {
	// TODO Auto-generated constructor stub
}

@Override
public E finn(E data) {
	// TODO Auto-generated method stub
	return null;
}

@Override
public int hentAntall() {
	// TODO Auto-generated method stub
	return 0;
}

@Override
public boolean settInn(E data) {
	// TODO Auto-generated method stub
	return false;
}

@Override
public boolean slett(E data) {
	// TODO Auto-generated method stub
	return false;
}

@Override
public Iterator<E> iterator() {
	// TODO Auto-generated method stub
	return null;
}

}

 

Her kan jeg ikke endre datatypen E i funksjonene uten at jeg bryter interfacen? Samt at E øverst i klassen (BinaerTre<E>) er en ukjent datatype? Whyyy? :dontgetit:

 

For de som er nysgjerrig laster jeg også opp hele oppgaven.

oblig3.pdf

Lenke til kommentar
Videoannonse
Annonse

Du har nok misforstått eller ikke forstått generics :)

 

BinaerTre<E> er et generisk grensesnitt som betyr at det kan være et BinaerTre av hva som helst (så lenge det implementerer Comparable i dette tilfellet). Når man skal lage en konkret implementasjon må man oppgi typen:

 

public class Treet implements BinaerTre<Kontakt> {

public Treet() {
	// TODO Auto-generated constructor stub
}

@Override
public Kontakt finn(Kontakt data) {
	// TODO Auto-generated method stub
	return null;
}

// ...
}

 

I dette tilfellet blir det å fylle ut Kontakt for E og Eclipse vil autogenerere alle metodene med korrekt signatur.

Lenke til kommentar

Oh, så jeg kan angi interfacen? Jeg trodde jeg måtte lage en klasse som implementerte interfacen kontakt for å så bruke den som datatype. Hmm. *gnisegiøynene* God morgen. Tror jeg er med nå, skal teste ut med engang. :D

 

Haha, det var ikke verre. Så genialt at du svarer meg rett før vekkerklokken ringer. Takk. Igjen viser deg seg at for min del hjelper det lite å gjøre dette nattestid. Sist glemte jeg to parenteser () når jeg forsøkte å jobbe nattestid. :thumbup:

Endret av data_jepp
Lenke til kommentar
Oh, så jeg kan angi interfacen? Jeg trodde jeg måtte lage en klasse som implementerte interfacen kontakt for å så bruke den som datatype. Hmm. *gnisegiøynene* God morgen. Tror jeg er med nå, skal teste ut med engang. inv_biggrin.gif

 

Det må du vel uansett? Ettersom du har metoder i interfacen du skal bruke, og uten å ha faktisk lagd de er de vel strengt tatt ubrukelige..

Lenke til kommentar

Ikke for å ødelegge, men har samme oppgaven og tror man er nødt til å skrive treet slik at det også kan håndtere andre typer enn Kontakt. Hvis du leser på 2.5 Tester (JUnit) så står det at man ikke nødvendigvis trenger å teste med Kontakt som elementer, men med f. eks String. Dette kan man ikke ved å lage treet for Kontakt, så vidt jeg har forstått.

Lenke til kommentar

Riktig, det er sant. Jeg har gjort det også, jeg rotet sånn første gang at jeg bare begynte om igjen. junit testene mine bruker Integer som elementer i treet.

 

Lol, ikke to constructors. Jeg har to "settInn" hvor den ene tar node klassen min og den andre tar et objekt som implementerer comparable.

 

Haha, jeg vet hvem du er!

Endret av data_jepp
Lenke til kommentar

Har endt opp med to settInn() jeg og, men det irriterer meg litt at jeg er nødt til å bruke @SuppressWarnings("unchecked") på en god del av metodene mine.

 

edit:

Men det viser seg at et trøtt hode faktisk ofte kan oppdage ting et våkent ikke kan :p Fant nettopp en løsning slik at jeg slipper supress warnings :D

Endret av Mapster
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...